web-dev-qa-db-fra.com

Boost générateur de nombres aléatoires

Est-ce que quelqu'un a un générateur de nombres aléatoires favori et pouvez-vous expliquer un peu comment la mettre en œuvre en code. J'essaie de faire travailler la Twister de Mersenne et je me demandais si quelqu'un avait la préférence à l'une des autres.

26
shinjuo

Ce code est adapté à partir du manuel de Boost à 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;
     }
}

Pour expliquer les bits:

  • mt19937 Est le générateur Twister Mersenne, qui génère les nombres aléatoires bruts. Un typedef est utilisé ici afin que vous puissiez facilement modifier le type de générateur de nombres aléatoires.

  • rng est une instance du générateur Twister.

  • one_to_six Est une instance d'une distribution . Cela spécifie les chiffres que nous voulons générer et la distribution qu'ils suivent. Ici, nous voulons 1 à 6, distribué uniformément.

  • dice est la chose qui prend les chiffres bruts et la distribution et crée pour nous les chiffres que nous souhaitons réellement.

  • dice() est un appel à operator() pour l'objet dice, qui obtient le numéro aléatoire suivant suivant la distribution, simulant un jet de dés six faces aléatoire.

Comme il se trouve, ce code produit la même séquence de dés dans les jetons à chaque fois. Vous pouvez aléorer le générateur dans son constructeur:

 RNGType rng( time(0) );   

ou en utilisant son membre de la graine ().

64
anon

J'ai trouvé lien qui donne un bon aperçu des propriétés des différents générateurs de nombres aléatoires. J'ai copié la table de lien ci-dessus pour plus de commodité:

 + ----------------------- + ------------------- + ----------------------------- + -------------------- ---- + 
 | générateur | durée du cycle | environ. besoins en mémoire | environ. vitesse relative | [. .____] + ----------------------- + ----------------- - + ----------------------------- + ----------------- ------- + 
 | minstd_Rand | 2 ^ 31-2 | sizeof (int32_t) | 40 | [. .____] | Rand48 | 2 ^ 48-1 | sizeof (uint64_t) | 80 | [. .____] | lrand48 (bibliothèque C) | 2 ^ 48-1 | - | 20 | [. .____] | ecuyer1988 | environ. 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 | environ. 2 ^ 32000 | 607 * sizeof (double) | 150 | [. .____] | lagged_fibonacci1279 | environ. 2 ^ 67000 | 1279 * sizeof (double) | 150 | [. .____] | lagged_fibonacci2281 | environ. 2 ^ 120000 | 2281 * sizeof (double) | 150 | [. .____] | lagged_fibonacci3217 | environ. 2 ^ 170000 | 3217 * sizeof (double) | 150 | [. .____] | lagged_fibonacci4423 | environ. 2 ^ 230000 | 4423 * sizeof (double) | 150 | [. .____] | lagged_fibonacci9689 | environ. 2 ^ 510000 | 9689 * sizeof (double) | 150 | [. .____] | lagged_fibonacci19937 | environ. 2 ^ 1050000 | 19937 * sizeof (double) | 150 | [. .____] | lagged_fibonacci23209 | environ. 2 ^ 1200000 | 23209 * sizeof (double) | 140 | [. .____] | lagged_fibonacci44497 | environ. 2 ^ 2300000 | 44497 * sizeof (double) | 60 | [. .____] + ----------------------- + ------------------ - + ----------------------------- + ------------------ ------ + 

la durée du cycle : longueur de la séquence de nombres aléatoires avant qu'il ne commence à répéter

4
Jatin Kumar

Il n'y a pas d'une taille unique - tout rng. Parfois, les propriétés statistiques sont importantes, parfois la cryptologie, parfois la vitesse brute.

1
Jive Dadson