2011-05-04 3 views

ответ

5

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

Предоставление вам возможности сделать это в случайном порядке независимо от времени.

+0

Спасибо. Но что, если я буду использовать следующий, а затем следующий следующий в следующей строке. Будет ли это еще случайным? –

+1

@ Dave-Heart. Да. –

1

Это не будет случайным, так как вы будете использовать одно и то же семя.

Имейте эту строку только один раз, за ​​пределами цикла, и используйте один и тот же экземпляр rnd на каждой итерации, вызвав его метод Next.

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

Насколько я знаю, семена по умолчанию, используемые C#, представляют собой миллисекунды, прошедшие с 1 января 1970 года.

2

Почему бы не переместить эту линию за пределы цикла и только вызвать метод Next() внутри цикла?

0

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

3

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

Очень жаль, что Random имеет этот вопрос и не поточно- - поэтому простой подход, имеющий единственную статическую переменную инициализированному раз не работает :(

Есть несколько подходов к решению это, в том числе создание экземпляра для каждого потока

у меня есть article, который входит в серию более подробно, что вы можете найти полезным

2

Нет, потому что призыв к новым System.Random();.. без параметров будет используйте системные часы как семя и, таким образом, получить одинаковые случайные числа в вашем цикле.

Вы должны создать новый объект System.Random() вне вашего цикла и получить следующее случайное число внутри цикла.

rnd.Next(); 
5

Из documentation:

псевдослучайных чисел выбираются с равной вероятностью из конечного множества чисел.Выбранные числа не являются полностью случайными, так как для используется математический алгоритм , но для практических целей они являются достаточно . Текущая реализация класса Random основана на модифицированной версии алгоритма генератора случайных чисел Дональда Э. Кнута . Для дополнительная информация, см. D. E. Knuth. «Искусство программирования, том 2: Семинумерные алгоритмы». Addison-Wesley, Reading, MA, второе издание, 1981.

Задержка между генерации двух случайных чисел не приходит во внимание. Конечно, это относится к вызывая Random.Next на тот же экземпляр вместо создания нового Random экземпляру каждый раз, как в коде (что неправильно):

Эту проблему можно избежать путем создания единого случайный объект, а чем несколько.

Для повышения производительности, создать один случайного объект генерировать много случайных чисел с течением времени, а неоднократно создавая новые объекты Случайных для генерации одного случайного числа.

Если вам нужно создать криптографическую силу хаотичность:

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

Смежные вопросы