Есть ли у кого-нибудь любимый генератор генераторов случайных чисел, и вы можете немного объяснить, как его реализовать в коде. Я пытаюсь заставить mersenne twister работать, и мне было интересно, есть ли у кого-то предпочтение в отношении одного из других.
Генератор случайных чисел
Ответ 1
Этот код адаптирован из руководства по ускорению в http://www.boost.org/doc/libs/1_42_0/libs/random/index.html:
#include <iostream>
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
using namespace std;
int main() {
typedef boost::mt19937 RNGType;
RNGType rng;
boost::uniform_int<> one_to_six( 1, 6 );
boost::variate_generator< RNGType, boost::uniform_int<> >
dice(rng, one_to_six);
for ( int i = 0; i < 6; i++ ) {
int n = dice();
cout << n << endl;
}
}
Объяснить бит:
-
mt19937
является генератором mersenne twister, который генерирует необработанные случайные числа. Здесь используется typedef, поэтому вы можете легко изменить тип генератора случайных чисел. -
rng
является экземпляром генератора твистеров. -
one_to_six
является экземпляром дистрибутива. Это указывает числа, которые мы хотим сгенерировать, и распределение, которое они следуют. Здесь мы хотим от 1 до 6, распределенных равномерно. -
dice
- это то, что принимает необработанные числа и распределение, и создает для нас числа, которые мы действительно хотим. -
dice()
- это вызовoperator()
для объектаdice
, который получает следующее случайное число, следующее за распределением, имитируя случайный шестисторонний бросок кубика.
В его нынешнем виде этот код производит одну и ту же последовательность бросков кубиков каждый раз. Вы можете рандомизировать генератор в своем конструкторе:
RNGType rng( time(0) );
или с помощью члена seed().
Ответ 2
Я нашел ссылку , которая дает хороший обзор свойств различных генераторов случайных чисел. Я скопировал таблицу из ссылки выше:
+-----------------------+-------------------+-----------------------------+------------------------+ | generator | length of cycle | approx. memory requirements | approx. relative speed | +-----------------------+-------------------+-----------------------------+------------------------+ | minstd_rand | 2^31-2 | sizeof(int32_t) | 40 | | rand48 | 2^48-1 | sizeof(uint64_t) | 80 | | lrand48 (C library) | 2^48-1 | - | 20 | | ecuyer1988 | approx. 2^61 | 2*sizeof(int32_t) | 20 | | kreutzer1986 | ? | 1368*sizeof(uint32_t) | 60 | | hellekalek1995 | 2^31-1 | sizeof(int32_t) | 3 | | mt11213b | 2^11213-1 | 352*sizeof(uint32_t) | 100 | | mt19937 | 2^19937-1 | 625*sizeof(uint32_t) | 100 | | lagged_fibonacci607 | approx. 2^32000 | 607*sizeof(double) | 150 | | lagged_fibonacci1279 | approx. 2^67000 | 1279*sizeof(double) | 150 | | lagged_fibonacci2281 | approx. 2^120000 | 2281*sizeof(double) | 150 | | lagged_fibonacci3217 | approx. 2^170000 | 3217*sizeof(double) | 150 | | lagged_fibonacci4423 | approx. 2^230000 | 4423*sizeof(double) | 150 | | lagged_fibonacci9689 | approx. 2^510000 | 9689*sizeof(double) | 150 | | lagged_fibonacci19937 | approx. 2^1050000 | 19937*sizeof(double) | 150 | | lagged_fibonacci23209 | approx. 2^1200000 | 23209*sizeof(double) | 140 | | lagged_fibonacci44497 | approx. 2^2300000 | 44497*sizeof(double) | 60 | +-----------------------+-------------------+-----------------------------+------------------------+
длина цикла: длина последовательности случайных чисел до начала повторения
Ответ 3
Там нет универсального RNG. Иногда статистические свойства важны, иногда криптология, иногда необработанная скорость.