Существует множество причин, по которым это может произойти. Одной из распространенных проблем является создание в программе нескольких экземпляров класса Random
. При использовании класса Random
вы должны создавать только один экземпляр и генерировать из него числа. Статья Создание лучших случайных чисел в C # содержит хорошее объяснение того, почему и почему не выполнение этого может привести к проблеме.
Другой распространенный сценарий - доступ к объекту класса Random
из нескольких потоков. System.Random
не является поточно-ориентированным (см. Примечания документации для Random
) и, таким образом, может привести к неожиданному и нежелательному поведению. Если вы используете его в многопоточной среде, вам нужно обязательно использовать некоторую форму блокировки, чтобы предотвратить одновременное создание случайными числами нескольких потоков.
Для более высоких степеней безопасности и случайности вы можете использовать криптографически безопасный генератор случайных чисел, такой как
System.Security.Cryptography.RNGCryptoServiceProvider . Обратите внимание, что использование более безопасного генератора случайных чисел приведет к снижению производительности по сравнению с System.Random
.
Если вам не нужно что-то криптографически безопасное, но вы все же хотите что-то более «случайное», чем класс Random
, вы можете исследовать его с помощью других PRNG, таких как Mersenne Twister. Есть много вариантов, каждый с различными характеристиками и профилями производительности. То, что вы выберете, сильно зависит от вашей цели.