Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1786 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  BOOST::RANDOM pas random du tout :(

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

BOOST::RANDOM pas random du tout :(

n°1676176
T'CHATTE
Posté le 24-01-2008 à 13:20:25  profilanswer
 

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 :)

mood
Publicité
Posté le 24-01-2008 à 13:20:25  profilanswer
 

n°1676184
Elmoricq
Modérateur
Posté le 24-01-2008 à 13:31:19  profilanswer
 

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


Message édité par Elmoricq le 24-01-2008 à 13:31:33
n°1676228
T'CHATTE
Posté le 24-01-2008 à 14:19:30  profilanswer
 

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

n°1676253
T'CHATTE
Posté le 24-01-2008 à 14:42:41  profilanswer
 

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 :)

n°1676272
Elmoricq
Modérateur
Posté le 24-01-2008 à 14:56:44  profilanswer
 

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

n°1676279
T'CHATTE
Posté le 24-01-2008 à 15:05:14  profilanswer
 

oui donc ca devrait aller :D

n°2210773
naneba2
Posté le 19-11-2013 à 14:27:37  profilanswer
 

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

n°2210971
gilou
Modérateur
Modzilla
Posté le 20-11-2013 à 00:59:06  profilanswer
 

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é!  --
n°2211026
naneba2
Posté le 20-11-2013 à 13:18:58  profilanswer
 

Je vais regarder ça,
Merci gilou :)

n°2218216
thoslecoyo​te
Posté le 31-01-2014 à 10:33:20  profilanswer
 

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)

mood
Publicité
Posté le 31-01-2014 à 10:33:20  profilanswer
 

n°2218310
tux1
Posté le 01-02-2014 à 14:24:07  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  BOOST::RANDOM pas random du tout :(

 

Sujets relatifs
Fonction random sous Firefox[C++] Tests Unitaires avec Boost
[résolu] [boost] problèmes avec copy_fileQT vs STL/Boost
[résolu] Random page promoboost::filesystem utilisation de copy_file
Random sur 5 caractèreslibtomcrypt fonction de hachage et random
[boost::thread] Comment limiter le nombre de threads simultanésintérêt de boost::multi_array ?
Plus de sujets relatifs à : BOOST::RANDOM pas random du tout :(


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR