Заполнение генератора случайных чисел в .NET - PullRequest
1 голос
/ 15 декабря 2008

У меня есть генератор псевдослучайных чисел (PRNG) с хорошими свойствами, который использует шесть UInt32 s в качестве состояния. Мне нужно найти разумный способ посеять это. Две очевидные возможности: 1) генерировать шесть случайных чисел, используя System.Random, и использовать их в качестве начальных чисел; 2) сгенерировать два GUID с Guid.NewGuid(). Что будет лучше?

Мне не нужна криптографическая защита.

Ответы [ 4 ]

4 голосов
/ 15 декабря 2008

К сожалению, System.Random () также требует начального значения. По умолчанию используется текущий счетчик тиков, который является предсказуемым, а не случайным. Так что вам понадобится семя для Рэндома, которое вернет вас к исходному вопросу ...

Раньше я никогда не использовал Guid.GetHashCode () в качестве начального числа, но моя 2-х секундная реакция - это не плохая идея.

4 голосов
/ 16 декабря 2008

Нужна ли вам криптографическая защита, почему бы просто не использовать System.Security.Cryptography.RNGCryptoServiceProvider для генерации случайных чисел? Если нет конкретной причины, как будто она слишком медленная, я не могу понять, почему вы бы ее не использовали. Так как это криптографический генератор случайных чисел, вы получите намного лучшие случайные числа, и вам не нужно беспокоиться о его заполнении.

4 голосов
/ 15 декабря 2008

Если ему нужно UInt32, то Random удобнее? Next(), Next(), Next() и т.д.

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

0 голосов
/ 18 февраля 2013

Попробуйте это для вашего начального значения ...

(UInt32)Math.Pow(System.DateTime.Now.TimeOfDay.TotalMilliseconds, 11.0 / 7.0)

Он просто увеличивает текущее время в миллисекундах до 11/7-й степени, что просто произвольно. Вы можете поэкспериментировать с другими фракциями, чтобы увидеть, работают ли они лучше для вас.

Помните, что если десятичный эквивалент вашей дроби больше, чем примерно 2,5, вы можете получить переполнение, и ваше начальное значение будет нулевым. (

Я использовал это некоторое время, и, похоже, он дает довольно хорошие начальные значения.

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