Гарантируется ли стабильность работы генератора случайных чисел C#? - PullRequest
3 голосов
/ 17 июня 2020

Я пишу программу, которая использует множество случайных чисел для генерации материала. Но я хочу заверить, что при запуске с одним и тем же семенем сгенерированный контент будет таким же. Итак, когда я создаю свое случайное число следующим образом:

Random r = new Random(seed);
int num = r.Next(); 

Как гарантируется, что num всегда будет одинаковым с течением времени (означает: несколько выпусков. NET)? Есть ли в фоновом режиме стандартизированный список? Или мне следует использовать свой собственный «случайный список», чтобы быть уверенным, что это никогда не изменится?

Ответы [ 2 ]

8 голосов
/ 17 июня 2020

Нет, результат одного и того же начального числа может различаться в разных версиях платформы, и в документации здесь:

Реализация генератора случайных чисел в Не гарантируется, что случайный класс останется неизменным в основных версиях платформы. NET. В результате вам не следует предполагать, что одно и то же начальное число приведет к одной и той же псевдослучайной последовательности в разных версиях. NET Framework .

Эта документация также содержит варианты этого совета в других разделах, например, в Получить ту же последовательность случайных значений :

В следующем примере используется 100100 как произвольное начальное значение для создания экземпляра объекта Random, отображает 20 случайных значений с плавающей запятой и сохраняет начальное значение. Затем он восстанавливает начальное значение, создает экземпляр нового генератора случайных чисел и отображает те же 20 случайных значений с плавающей запятой. Обратите внимание, что этот пример может создавать разные последовательности случайных чисел при запуске на разных версиях. NET Framework.

И:

Однако обратите внимание, что случайные объекты в процессах , работающих под разными версиями. NET Framework, могут возвращать разные серии случайных чисел, даже если они созданы с одинаковыми начальными значениями .

3 голосов
/ 17 июня 2020

Чтобы быть точным: нет, не существует «стандартизованного списка» - это PRNG , поэтому он просто выполняет одни и те же математические операции снова и снова, что делает его предсказуемым ( terministi c) из того же начального числа, до тех пор, пока никто не изменяет используемый алгоритм PRNG. Учитывая, что люди часто используют Random для таких вещей, как заполнение тестовых данных, я думаю, что это вызвало бы протест, если бы оно внезапно изменилось (без какого-либо согласия, как новый параметр конструктора), поэтому я бы его нашел маловероятно , чтобы сделать это (а они еще не датированы), но: если «маловероятно» недостаточно, вы всегда можете просто реализовать любой из нескольких алгоритмов ГПСЧ в своем собственном коде.

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