Nombres Aléatoires

Nombres Aléatoires - C - Programmation

Marsh Posté le 17-01-2006 à 16:50:17    

Bonjour à tous et à toutes,
 
Merci d'avance à ceux qui liront ma question :
 
- J'ai un prog qui met ~0.01 sec à s'executer.
- Il fait un appel à srand(time(NULL)) pour initialiser le générateur et  plusieurs à rand(void) pour la séquence de nombres aléatoires.
- Si je l'execute moins de 100 fois d'affilé, la valeur de time(NULL) est toujours la meme, donc la sequence de nombres aléatoires générée aussi.
 
Comment peut on faire pour avoir une graine différente à chaque execution, c'est à dire plusieurs graines différentes en moins d'un seconde?
 
J'ai pensé à clock(), mais il est probable pour que le prog mette à chaque execution autant de temps à s'executer jusqu'au srand.
 
Une suggestion?
 
Merci d'avance et si besoin de plus de précision, hesitez pas!
 
PS : j'utilise un equivalent plus robuste que rand() qu'on peut trouver sur "Numérical recipes" chapitre 7.2 http://www.library.cornell.edu/nr/cbookcpdf.html.


Message édité par koskos le 17-01-2006 à 16:53:28
Reply

Marsh Posté le 17-01-2006 à 16:50:17   

Reply

Marsh Posté le 17-01-2006 à 19:04:12    

La suggestion est de n'appeler srand() qu'une seule fois, au lieu de l'appeler constamment (d'ailleurs, il ne sert à rien de l'appeler avec time() ; on peut l'appeler avec un numéro quelconque, pas forcément avec le temps).

Reply

Marsh Posté le 17-01-2006 à 19:19:45    

utilise le pid ptêtre.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 17-01-2006 à 20:02:03    

ouais, un bon time(NULL) ^ getpid()

Reply

Marsh Posté le 17-01-2006 à 23:55:34    

si tu bosse sous windows, il existe la fonction QueryPerformanceCounter  
qui te renvoie le nombre de cycle d'horloge depuis la mise en route du processeur.
Elle te renvoie donc une valeur différente à chaque fois.
Mais comme dis olivthill, ce n'est pas une bonne chose d'appeler trop souvent srand.
pour éviter justement les problèmes que tu rencontre, et si tu l'appelle avec comme paramètre le temps, fais en sorte qu'il y ait un delai variable et aléatoire entre deux appels. et ce délai aléatoire ne devrait pas provenir d'un rand bien sur :-)
tu peux aussi utiliser d'autres sources pour initialiser ton générateur aléatoire, la position du curseur de la souris, la taille de mémoire disponible etc...

Reply

Marsh Posté le 18-01-2006 à 00:05:33    

si tu bosses sous nux au lieu d'aller chercher manuellement toutes ces informations, va lire /dev/random ( ou /dev/urandom selon les besoins et l'existence ).


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Sujets relatifs:

Leave a Replay

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