Impulsar el generador de números aleatorios

Resuelto shinjuo asked hace 14 años • 3 respuestas

¿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.

shinjuo avatar Feb 13 '10 03:02 shinjuo
Aceptado

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:

  • mt19937es 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.

  • rnges una instancia del generador de tornados.

  • one_to_sixes 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.

  • dicees 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 al operator()objeto dice, 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().

 avatar Feb 12 '2010 20:02

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

Jatin Kumar avatar Oct 03 '2015 01:10 Jatin Kumar

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.

Jive Dadson avatar Feb 13 '2010 10:02 Jive Dadson