случайный двоичный файл размером в миллион бит - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу сгенерировать случайный двоичный файл размером в миллион бит, но моя проблема в том, что код занимает много времени и не выполняется, почему это происходит?

string result1 = "";

  Random rand = new Random();
        for (int i = 0; i < 1000000; i++)
        {

            result1 += ((rand.Next() % 2 == 0) ? "0" : "1");

        }

         textBox1.Text = result1.ToString();

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Это работает для меня, это занимает около 0,035 секунд на моем ящике:

   private static IEnumerable<Byte> MillionBits()
   {
       var rand = new RNGCryptoServiceProvider();
       //a million bits is 125,000 bytes, so
       var bytes = new List<byte>(125000);
       for (var i = 0; i < 125; ++i)
       {
           byte[] tempBytes = new byte[1000];
           rand.GetBytes(tempBytes);
           bytes.AddRange(tempBytes);
       }

       return bytes;
   }

   private static string BytesAsString(IEnumerable<Byte> bytes)
   {
       var buffer = new StringBuilder();
       foreach (var byt in bytes)
       {
           buffer.Append(Convert.ToString(byt, 2).PadLeft(8, '0'));
       }

       return buffer.ToString();
   }

и затем:

   var myStopWatch = new Stopwatch();
   myStopWatch.Start();
   var lotsOfBytes = MillionBits();
   var bigString = BytesAsString(lotsOfBytes);
   var len = bigString.Length;
   var elapsed = myStopWatch.Elapsed;

Переменная len равнялась миллиону, строка выглядела так, как будто это были все 1 и 0.

Если вы действительно хотите заполнить текстовое поле нулями и нулями, просто установите для его свойства Text значение bigString.

0 голосов
/ 13 сентября 2018

Объединение строк является операцией O (N).Строки являются неизменяемыми, поэтому при добавлении в строку новое значение копируется в новую строку, что требует повторения предыдущей строки.Так как вы добавляете значение для каждой итерации, количество, которое нужно читать каждый раз, увеличивается с каждым добавлением, что приводит к производительности O (N ^ 2).Поскольку ваше N равно 1 000 000, это занимает очень и очень много времени, и, вероятно, потребляет всю память, хранящуюся в этих промежуточных одноразовых строках.

Нормальное решение при построении строки с произвольным числомвходы вместо этого использовать StringBuilder.Хотя битовая строка из 1 000 000 символов все еще ... громоздка.Предполагая, что цепочка битов - это то, что вам нужно / нужно, вы можете изменить свой код на что-то вроде следующего и получить гораздо более производительное решение.

public string GetGiantBitString() {
    var sb = new StringBuilder();
    var rand = new Random();
    for(var i = 0; i < 1_000_000; i++) {
        sb.Append(rand.Next() % 2);
    }
    return sb.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...