В дополнение к предыдущим ответам:
System.Random
следует НИКОГДА не использовать в моделированиях или численных решениях для науки и техники, где имеются существенные негативные последствия неточных результатов моделирования или сбоя сходимости. Это связано с тем, что реализация Microsoft является глубоко ошибочной в нескольких отношениях, и они не могут (или не будут) легко ее исправить из-за проблем совместимости. См это сообщение .
Итак:
Если есть злоумышленник, который не должен знать сгенерированную последовательность , тогда используйте RNGCryptoServiceProvider
или другой тщательно спроектированный, реализованный и проверенный криптографически стойкий ГСЧ, и, по возможности, в идеале используйте аппаратную случайность. В противном случае,
Если это приложение, такое как моделирование, которое требует хороших статистических свойств , тогда используйте тщательно разработанный и внедренный не крипто-PRNG, такой как Mersenne Twister . (В этих случаях криптографический ГСЧ также будет правильным , но часто слишком медленным и громоздким.) В противном случае;
ONLY , если использование чисел является совершенно тривиальным , например, решение о том, какое изображение показывать следующим в рандомизированном слайд-шоу, затем используйте System.Random
.
Недавно я столкнулся с этой проблемой очень ощутимо, работая над симуляцией Монте-Карло, предназначенной для проверки влияния различных моделей использования медицинских устройств. Моделирование дало результаты, которые мягко пошли в направлении, противоположном того, что было бы разумно ожидать.
Иногда, когда вы не можете что-то объяснить, за этим стоит причина, и эта причина может быть очень обременительной!
Ниже приведен график значений p , полученных при увеличении количества партий моделирования:
System.Random">
Красные и пурпурные графики показывают статистическую значимость различий между двумя моделями использования в двух исследуемых выходных метриках.
Голубой график является особенно шокирующим результатом, поскольку он представляет p ‑ значения для характеристики случайного входа для моделирования. (Это было построено только для того, чтобы подтвердить, что входные данные не были ошибочными.) Входные данные, конечно, были одинаковыми для двух исследуемых моделей использования, поэтому не должно было быть статистически значимой разницы между входом на две модели. Тем не менее, здесь я лучше, чем на 99,97%, был уверен, что была такая разница !!
Сначала я думал, что в моем коде что-то не так, но все проверил. (В частности, я подтвердил, что потоки не разделяют System.Random
экземпляров.) Когда повторное тестирование показало, что этот неожиданный результат является весьма непротиворечивым, я начал подозревать System.Random
.
Я заменил System.Random
реализацией Mersenne Twister - никаких других изменений - и сразу же результат стал резко отличаться, как показано здесь:
Эта диаграмма отражает отсутствие статистически значимой разницы между двумя моделями использования для параметров, используемых в этом конкретном наборе тестов. Это был ожидаемый результат.
Обратите внимание, что на первом графике вертикальная логарифмическая шкала (в значении p ) охватывает семь десятилетий , тогда как во втором - только одно десятилетие, демонстрирующее только насколько ярко выражена статистическая значимость ложных расхождений! (Вертикальная шкала указывает на вероятность того, что расхождения могли возникнуть случайно.)
Я подозреваю, что System.Random
имеет некоторые корреляции относительно довольно короткого поколенияЦикл эратора и различные образцы внутренней случайной выборки между двумя тестируемыми моделями (у которых было существенно различное количество вызовов Random.Next
) заставили их по-разному влиять на две модели.
Так получилось, что симуляция вход основана на тех же потоках ГСЧ, что и модели, используемые для внутренних решений, и это, очевидно, привело к тому, что несоответствия выборки повлияли на вход. (Это на самом деле повезло, потому что в противном случае я, возможно, не понял, что неожиданный результат был программной ошибкой, а не каким-то реальным свойством моделируемых устройств!)