Я ищу эффективный, достаточно надежный ГСЧ без специального оборудования. Он может использовать математические методы (Mersenne Twister и т. Д.), Он может «собирать энтропию» с машины, что угодно. В Linux / etc у нас есть drand48()
48, которые генерируют 48 случайных битов. Я хотел бы подобную функцию / класс для C ++ или C #, которая может генерировать более 32 битов случайности и которые биты младшего разряда столь же случайны, как биты старшего разряда.
Он не должен быть криптографически безопасным, но он не должен использовать или основываться на языке C rand()
или .NET System.Random
.
Любой исходный код, ссылки на источник и т. Д. Будет принята с благодарностью! В противном случае, какой тип ГСЧ я должен искать?
Для C ++ Boost.Random , вероятно, то, что вы ищете. Он поддерживает MT (среди многих других алгоритмов) и может собирать энтропию через nondet_random
класс. Проверьте это! :-)
В Научной библиотеке Gnu (GSL) имеется довольно обширный набор генераторов RN, тестовых наборов и т. Д. Если вы работаете в Linux, возможно, он уже доступен в вашей системе.
Остерегайтесь научной библиотеки Гну. Он лицензируется под лицензией GPL, а не LGPL.
Как уже упоминалось, случайные классы Boost - хорошее начало. Их реализация соответствует коду PRNG для TR1:
http://www.boost.org/doc/libs/1_35_0/libs/random/index.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html
Если у вас есть последняя версия компилятора G ++, вы можете обнаружить, что библиотеки TR1 уже включены
C ++ 11 принял надежную библиотеку случайных чисел, основанную на boost.random. Вы можете получить доступ к нескольким механизмам случайных чисел, используя различные алгоритмы, чтобы удовлетворить ваши требования к качеству, скорости или размеру. Качественные реализации даже обеспечат доступ к любому недетерминированному ГСЧ, через который ваша платформа предлагает std::random_device
.
Кроме того, существует множество адаптеров для создания определенных дистрибутивов, что устраняет необходимость выполнять такие манипуляции вручную (что часто делается неправильно).
Boost.Random
мой первый выбор для RNG
System.Random
? Я знаю, чтоrand
это плохо,System.Random
а также плохо? Если это так, это грустно :(