Какой генератор случайных чисел без энтропии лучше всего подходит для C #? - PullRequest
1 голос
/ 16 ноября 2011

Я делаю проект, включающий в себя выборку миллионов случайных выборок из набора в рамках эвристики, чтобы найти лучший путь в решении проблемы коммивояжера.
Мне нужен генератор случайных чисел, чья «случайность» не будет исчерпана после стольких выборок.
Он также должен быть быстрым и как можно более случайным.
Какой генератор случайных чисел лучше всего использовать в таком случае?
(Я знаю, C # не лучший язык для коммивояжера, но это требование:)).

РЕДАКТИРОВАТЬ: Чтобы уточнить, что я имею в виду, / dev / random в системах UNIX является генератором на основе энтропии. Вот почему вы должны двигать мышью, чтобы генерировать SSH-ключ: генератор случайных чисел, который он использует, основан на пользовательском вводе для генерации энтропии. Короче говоря, мне нужен хороший генератор случайных чисел, который основан на семени, а не на энтропии. Я не знаю, был ли класс Random основан на семени или энтропии. Кроме того, мне интересно, используют ли другие классы лучший метод, чем класс Random (который, я полагаю, использует линейную конгруэнтность).

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Стандартный класс System.Random использует (со знаком) 32-битные целые числа для начального числа и значений, ожидайте, что он будет повторяться после 2 миллиардов выборок или около того.

4 голосов
/ 16 ноября 2011

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

Дополнительную документацию можно найти по адресу http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator.aspx

После быстрого теста я обнаружил, что смог генерировать 4 миллиона байтов случайных данных за 28 мс и 400 миллионов за 2,5 секунды. Это привело к созданию байтового массива, который можно было подключить к BinaryReader, чтобы получить любой необходимый тип данных.

...