Генератор случайных чисел c # - PullRequest
10 голосов
/ 27 мая 2011
  Random ran = new Random();
  byte tmp = (byte)ran.Next(10);

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

Ответы [ 3 ]

14 голосов
/ 27 мая 2011

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

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

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

Если вам не нужно что-то криптографически безопасное, но вы все же хотите что-то более «случайное», чем класс Random, вы можете исследовать его с помощью других PRNG, таких как Mersenne Twister. Есть много вариантов, каждый с различными характеристиками и профилями производительности. То, что вы выберете, сильно зависит от вашей цели.

1 голос
/ 28 мая 2011

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

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, так как случайно это должно быть?

0 голосов
/ 27 мая 2011

Вы также можете рассмотреть API random.org

http://www.random.org/clients/http/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...