2010-02-12 27 views
23

Czy ktoś ma ulubiony generator liczb losowych doładowania i czy możesz wyjaśnić trochę, jak zaimplementować go w kodzie. Próbuję zmusić maszynę do pracy z mersenne i zastanawiałem się, czy ktoś ma preferencje wobec jednego z pozostałych.Boost generator liczb losowych

Odpowiedz

63

Kod ten jest dostosowany z podręcznika przypominające w 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; 
    } 
} 

Aby wyjaśnić bity:

  • mt19937 jest generatorem Twister Mersenne generująca surowych liczb losowych. Użyty jest tu typedef, dzięki czemu można łatwo zmienić typ generatora liczb losowych.

  • rng jest instancją generatora twister.

  • one_to_six jest instancją dystrybucji . Określa liczby, które chcemy wygenerować, oraz rozkład, który śledzą. Tutaj chcemy 1 do 6, równomiernie rozmieszczonych.

  • dice to rzecz, która przyjmuje nieprzetworzone liczby i dystrybucję i tworzy dla nas liczby, które naprawdę chcemy.

  • dice() jest wezwaniem do operator() dla obiektu dice, który dostaje następną liczbę losową w wyniku podziału, symulując losowo sześciokątną rzut kośćmi.

W obecnej postaci kod generuje za każdym razem tę samą sekwencję kostek. Można losowo generować generator w swoim konstruktorze:

RNGType rng(time(0)); 

lub przy użyciu jego elementu seed().

+0

A czy jest jakiś sposób na min i max rozkładu całkowitej zostać zmienione bez konieczności tworzenia nowych "kostek"? –

+0

Czy ktoś wie, jak ustawić losowe zaszczepienie przy użyciu tego generatora? –

1

Nie ma jednego uniwersalnego RNG. Czasami ważne są właściwości statystyczne, czasem kryptologia, czasem surowa prędkość.

+0

Nie koniecznie chciałem mieć jeden rozmiar, po prostu wiem, że niektórzy wolą jedno od drugiego i chciałem zobaczyć, którzy ludzie najbardziej lubili. – shinjuo

4

Znalazłem to link, które daje dobry przegląd właściwości różnych generatorów liczb losowych. Mam skopiowane tabelę z powyższego linku dla wygody:

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

długość cyklu: Długość losowej sekwencji liczb zanim zacznie powtarzać

Powiązane problemy