2010-02-12 20 views
23

¿Alguien tiene un generador de números aleatorios de refuerzo favorito y puede explicar un poco sobre cómo implementarlo en el código. Estoy tratando de hacer funcionar al misterioso tornado y me preguntaba si alguien tenía preferencia por uno de los otros.Boost generador de números aleatorios

Respuesta

63

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 tornado Mersenne, que genera los números aleatorios primas. Un typedef se usa aquí para que pueda cambiar fácilmente el tipo de generador de números aleatorios.

  • rng es una instancia del generador de twister.

  • one_to_six es una instancia de distribución. Esto especifica los números que queremos generar y la distribución que siguen. Aquí queremos 1 a 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 a operator() para el objeto dice, que obtiene el siguiente número aleatorio tras la distribución, simulando un tiro al azar dados de seis caras.

Tal como está, este código produce la misma secuencia de lanzamiento de dados cada vez. Puede aleatorizar el generador en su constructor:

RNGType rng(time(0)); 

o usando su miembro seed().

+0

y hay alguna manera de la min y max de la distribución de número entero ser cambiado sin tener que construir un nuevo "dado"? –

+0

¿Alguien sabe cómo establecer la siembra aleatoria con este generador? –

1

No hay un RNG único para todos. A veces, las propiedades estadísticas son importantes, a veces la criptología, a veces la velocidad bruta.

+0

No necesariamente quería una talla única, solo sé que algunas personas prefieren una sobre la otra y yo quería ver cuáles les gustaba más a las personas. – shinjuo

4

Encontré este link que da una buena descripción de las propiedades de diferentes generadores de números aleatorios. He copiado la tabla de enlace de arriba por conveniencia:

 
+-----------------------+-------------------+-----------------------------+------------------------+ 
|  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 | 
+-----------------------+-------------------+-----------------------------+------------------------+ 

longitud de ciclo de: longitud de la secuencia de números aleatorios antes de que comience la repetición de

Cuestiones relacionadas