Реальный случайный генератор С#

  Random ran = new Random();
  byte tmp = (byte)ran.Next(10);

Есть ли альтернатива этому коду? Похоже, что это не случайное поведение.

Ответ 1

Есть несколько причин, почему это может произойти. Одной из распространенных проблем является создание нескольких экземпляров класса Random в программе. При использовании класса Random вы должны создавать только один экземпляр и генерировать из него числа. Статья " Создание лучших случайных чисел в С#" содержит хорошее объяснение причин и объясняет, почему не выполнение этого может привести к проблеме.

Другой распространенный сценарий - доступ к объекту класса Random из нескольких потоков. System.Random не является поточно-ориентированным (см. Раздел "Примечания" в документации по Random) и, таким образом, может привести к неожиданному и нежелательному поведению. Если вы используете его в многопоточной среде, вам нужно обязательно использовать некоторую форму блокировки, чтобы предотвратить одновременное создание случайными числами нескольких потоков.

Для более высоких степеней безопасности и случайности вы можете использовать криптографически безопасный генератор случайных чисел, такой как System.Security.Cryptography.RNGCryptoServiceProvider. Обратите внимание, что использование более безопасного генератора случайных чисел приведет к снижению производительности по сравнению с System.Random.

Ответ 2

Это может быть проще. Если вы можете использовать этот метод в замкнутом цикле:

for (int i = 0; i < 1000; i++)
{
   Random ran = new Random();
   byte tmp;            
   tmp = (byte)ran.Next(10);
}

Вы можете видеть одно и то же число снова и снова. Убедитесь, что вы создаете объект Random вне любых циклов.

Random ran = new Random();

for (int i = 0; i < 1000; i++)
{
   byte tmp;            
   tmp = (byte)ran.Next(10);
}

Тем не менее, правда, что поставщик криптографии лучше. Но вы только получаете рэндомы между 0 и 9, так как случайным это должно быть?