définition de rand()

définition de rand() - C++ - Programmation

Marsh Posté le 04-01-2005 à 18:10:25    

Bonjour,
 
Pour ma culture, j'aimerais savoir comment sont générés les nombres pseudo-aléatoires fournis par rand() en C++. J'ai essayé de chercher sur internet mais je n'ai rien trouvé de clair.
 
Est ce qu'il s'agit simplement d'une fonction du type :
 
u(n+1) = (a u(n) + b)% RAND_MAX
 
ou est ce plus compliqué (utilisation de plusieurs valeurs u(n), u(n-1) etc) ?
 
Merci d'avance de votre réponse,

Reply

Marsh Posté le 04-01-2005 à 18:10:25   

Reply

Marsh Posté le 04-01-2005 à 22:26:57    

Dans les sources de la glibc :
val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;

Reply

Marsh Posté le 05-01-2005 à 08:25:15    

Mouais, ça n'est pas très clair.
state[0] correspond à l'ancienne valeur retournée par rand() ? Dans ce cas, à quoi correspond l'opération & 0x7fffffff, une multiplcation, un modulo ?
 
D'autre part, j'ai l'impression que rand() doit utiliser plusieurs valeurs retournées précédemment. En effet, quand une même valeur est donnée plusieurs fois, la valeur retournée ensuite n'est pas la même.

Reply

Marsh Posté le 05-01-2005 à 09:06:01    

& 0x7fffffff est un mask, ça doit être pour limiter la valeur, ou plutôt la rendre systématiquement posistive ...

Reply

Marsh Posté le 10-01-2005 à 10:35:01    

Bonjour,
 

Reply

Marsh Posté le 10-01-2005 à 10:37:07    


[:autobot]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 10-01-2005 à 10:38:52    

Oups, j'ai été trop rapide ...
 
Re-Bonjour,
 
J'aimerais essyé de voir dans les sources de gcc comment est programmé la génération de nombres aléatoires. Comment est ce que je peut m'orienter à partir du site de gcc :
 
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/
 
Est ce que qqn saurait comment trouver la définition de la méthode rand() ?
 
De même, si je cherche la défintion d'une autre fonction mathématique (ex : sin, cos, exp ...), est-il possible de savoir à partir de ce site comment elle est calculée par gcc ?
 
Merci d'avance de vos réponses !
 
Nathan
 

Reply

Marsh Posté le 11-01-2005 à 20:47:36    

Pour la fonction rand() (chui pas sûr) mais je crois que c'est basé sur l'horloge systeme !? Lors de l'apel de la fonction il capture l'heure (les millisecondes) et il doit ensuite faire un traitement mathématique... :/ comment il génèrerer un nb aléatoire sinon ? Mais ce n'est qu'une supposition !

Reply

Marsh Posté le 11-01-2005 à 21:45:42    

Z3RgSp4wN a écrit :

Pour la fonction rand() (chui pas sûr) mais je crois que c'est basé sur l'horloge systeme !? Lors de l'apel de la fonction il capture l'heure (les millisecondes) et il doit ensuite faire un traitement mathématique... :/ comment il génèrerer un nb aléatoire sinon ? Mais ce n'est qu'une supposition !


 
la bonne façon d'utiliser rand() est d'appeler srand() avec une valeur tiré de l'horloge. rand() ne le fait pas tout seul. Une fois que rand() à une graine, il génère des nombres pseudo-aléatoires avec des algos compliqués utilisant les nombres magiques je crois. C'est au programme de maitrise de math pure ...
 
ça ressemble à que disais blurk :
"val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;"

Reply

Marsh Posté le 11-01-2005 à 21:48:59    

gcc c'est le compilateur, rand (et autres...) est définie dans une bibliothèque comme la glibc, que tu peux trouver par ici : ftp://ftp.gnu.org/gnu/glibc/

Reply

Marsh Posté le 11-01-2005 à 21:48:59   

Reply

Marsh Posté le 12-01-2005 à 09:57:58    

Ok, j'ai trouvé le fichier random_r.c qui doit être celui dont tu parlais blurk.
 
Est ce que le fait que j'utilise g++ comme compilateur change qqch dans la méthode utilisée pour générer des nombres aléatoires ? En fait, tel que je le comprends, cette librairie (glic) est une librairie de fonctions propres au C. En utilisant un compilateur C++, est ce que, néanmoins, je fais nécessairement appel à cette librairie où est que le compilateur g++ cherche une autre défintion de rand().
 
Ma question tiens principalement au fait que la fonction que j'ai trouvée dans glibc a pour en-tête "int __random_r ", mais je me suis peut être trompé dans ma recherche ?
 
Merci déja pour ces premières réponses.
 
Nathan

Reply

Sujets relatifs:

Leave a Replay

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