BOOST::RANDOM pas random du tout :(

BOOST::RANDOM pas random du tout :( - C++ - Programmation

Marsh Posté le 24-01-2008 à 13:20:25    

Salut à tous!
 
J'utilise la fonction random de la librairie boost pour générer des nombres aléatoires .... qui ne le sont pas :D
En fait chaque fois que je relance le programmes, tous ces nombres sont identiques ... Alors certes, le résultat final n'est pas faux, mais du coup je tombe toujours sur le même ce qui n'est pas très crédible pour quelque chose qui est supposé être aléatoire...
J'aimerai donc savoir si c'était un problème du à la fonction elle même ou bien est ce moi qui ne l'ai pas bien utilisé?
 
Je fais comme ca :
 
typedef boost::mt19937 base_generator_type;
 
base_generator_type generator_com_met;
    typedef boost::uniform_int<> distribution_type_com_met;
    typedef boost::variate_generator<base_generator_type&, distribution_type_com_met> gen_type_com_met;
 
...
 
gen_type_coo die_gen_coo(generator_coo, distribution_type_coo(0, coo.size()-1));
    boost::generator_iterator<gen_type_coo> die_coo(&die_gen_coo);
 
variable=*die_coo++;
 
 
C'est faux ca???
 
Merci d'avance :)

Reply

Marsh Posté le 24-01-2008 à 13:20:25   

Reply

Marsh Posté le 24-01-2008 à 13:31:19    

Il faut utiliser un random seed différent pour chaque instance du programme.


Message édité par Elmoricq le 24-01-2008 à 13:31:33
Reply

Marsh Posté le 24-01-2008 à 14:19:30    

ah mince je pensai qu'il le faisait tout seul :)
 
Jvais voir si je trouve comment on seed avec boost ...
 
Merci :jap:

Reply

Marsh Posté le 24-01-2008 à 14:42:41    

bon je sais pas si c'est l'idéal mais ca à l'air de marcher comme ca :
 
generator_coo.seed(time(NULL));
 
Si tu as mieux a proposer Elmoricq je suis tout ouï, sinon merci bien pour ton aide :)

Reply

Marsh Posté le 24-01-2008 à 14:56:44    

C'est pas mal si tu ne lances pas plusieurs instances du programme dans la même seconde. ;)

Reply

Marsh Posté le 24-01-2008 à 15:05:14    

oui donc ca devrait aller :D

Reply

Marsh Posté le 19-11-2013 à 14:27:37    

Je re-ouvre le sujet :)
 
Et si justement on lance plusieurs instances à la fois?  
Voila mon code (rapide!):

Code :
  1. double rnorm(double moy, double e_type)
  2. {
  3.   boost::mt19937 rng(static_cast<long unsigned int>(std::time(0)));
  4.   boost::normal_distribution<double>  nd(moy, e_type);
  5.   boost::variate_generator<boost::mt19937&,
  6.                            boost::normal_distribution<double> > var_nor(rng, nd);
  7.   return var_nor();
  8. }


 
J'ai l'impression que dans ce cas la,

Code :
  1. std::time(0)

n'est pas assez rapide (change toutes les secondes) ...
Une idée??  
 
Merci, merci,
Nane

Reply

Marsh Posté le 20-11-2013 à 00:59:06    

En C++11, on a maintenant <random>
 

Code :
  1. #include <chrono>
  2. #include <random>
  3. //........................................
  4.     // rand initialisé avec une seed à time(), C++11 style
  5.   unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  6.   std::default_random_engine generator (seed);
  7.   std::uniform_int_distribution<int> distribution(1,100);
  8.   int number = distribution(generator);
  9. .//.............................................................


 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-11-2013 à 13:18:58    

Je vais regarder ça,
Merci gilou :)

Reply

Marsh Posté le 31-01-2014 à 10:33:20    

Citation :

Et si justement on lance plusieurs instances à la fois?  


 
Si tu lances les instances en parallèle avec MPI, tu peux multiplier le "time(NULL)" par le rang de ton process, genre

Code :
  1. srand(time(NULL) - 360000*myrank);


(où myrank est le rang de ton process, et 360000 est arbitraire...)
(mais bon tu ne les lances ptete pas avec MPI et j'arrive après la guerre)

Reply

Marsh Posté le 31-01-2014 à 10:33:20   

Reply

Marsh Posté le 01-02-2014 à 14:24:07    

L'algorithme qui calcule les nombres aléatoires n'est pas fait pour que tu changes de seed à chaque fois.
Si tu veux simuler 1000 nombres aléatoires et que tu les simules avec 1000 seeds différents, ils perdent leur caractère aléatoire.
Donc la bonne manière de faire à mon avis est de poser la seed de départ comme time() au démarrage de ton programme et de ne plus la changer par la suite

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed