Impulsar el generador de números aleatorios
¿Alguien tiene un generador de números aleatorios de impulso favorito? ¿Puede explicar un poco cómo implementarlo en el código? Estoy tratando de hacer funcionar el tornado mersenne y me preguntaba si alguien tenía preferencia por alguno de los demás.
Este código está adaptado del manual de impulso en 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;
}
}
Para explicar los bits:
mt19937
es el generador de mersenne twister, que genera números aleatorios sin procesar. Aquí se utiliza un typedef para que pueda cambiar fácilmente el tipo de generador de números aleatorios.rng
es una instancia del generador de tornados.one_to_six
es una instancia de una distribución . Esto especifica los números que queremos generar y la distribución que siguen. Aquí queremos del 1 al 6, distribuidos uniformemente.dice
es lo que toma los números brutos y la distribución, y crea para nosotros los números que realmente queremos.dice()
es una llamada aloperator()
objetodice
, que obtiene el siguiente número aleatorio siguiendo la distribución, simulando un lanzamiento aleatorio de dados de seis caras.
Tal como está, este código produce la misma secuencia de lanzamientos de dados cada vez. Puedes aleatorizar el generador en su constructor:
RNGType rng( time(0) );
o utilizando su miembro seed().
Encontré este enlace que ofrece una buena descripción general de las propiedades de diferentes generadores de números aleatorios. He copiado la tabla del enlace de arriba por conveniencia:
+-----------------------+-------------------+----- ------------------------+------------------------+ | generador | duración del ciclo | aprox. requisitos de memoria | aprox. velocidad relativa | +-----------------------+-------------------+----- ------------------------+------------------------+ | minstd_rand | 2^31-2 | tamaño de (int32_t) | 40 | | rand48 | 2^48-1 | tamaño de (uint64_t) | 80 | | lrand48 (biblioteca C) | 2^48-1 | - | 20 | | ecuyer1988 | aprox. 2^61 | 2*tamaño de(int32_t) | 20 | | kreutzer1986 | ? | 1368*tamaño de(uint32_t) | 60 | | hellekalek1995 | 2^31-1 | tamaño de (int32_t) | 3 | | mt11213b | 2^11213-1 | 352*tamañode(uint32_t) | 100 | | mt19937 | 2^19937-1 | 625*tamañode(uint32_t) | 100 | | lagged_fibonacci607 | aprox. 2^32000 | 607*tamañode(doble) | 150 | | lagged_fibonacci1279 | aprox. 2^67000 | 1279*tamañode(doble) | 150 | | lagged_fibonacci2281 | aprox. 2^120000 | 2281*tamañode(doble) | 150 | | lagged_fibonacci3217 | aprox. 2^170000 | 3217*tamaño de(doble) | 150 | | lagged_fibonacci4423 | aprox. 2^230000 | 4423*tamaño de(doble) | 150 | | lagged_fibonacci9689 | aprox. 2^510000 | 9689*tamañode(doble) | 150 | | lagged_fibonacci19937 | aprox. 2^1050000 | 19937*tamaño de(doble) | 150 | | lagged_fibonacci23209 | aprox. 2^1200000 | 23209*tamaño de(doble) | 140 | | lagged_fibonacci44497 | aprox. 2^2300000 | 44497*tamaño de(doble) | 60 | +-----------------------+-------------------+----- ------------------------+------------------------+
duración del ciclo : duración de la secuencia de números aleatorios antes de que comience a repetirse
No existe un RNG único para todos. A veces las propiedades estadísticas son importantes, a veces la criptología, a veces la velocidad bruta.