Trouver avec exactitude un nombre aléatoire..

Fermé
laagarkane - 9 oct. 2009 à 21:38
 Utilisateur anonyme - 10 oct. 2009 à 10:33
Bonjour,
Je fais un peu de programmation, et ayant de temps en temps utilisé la fonction srand() en C/C++, une question existentielle me titille :P
D'après ce que j'ai compris, cette fonction se base sur la date.
j'aurai voulu en savoir un peu plus... quelle est la formule utilisée pour générer le nombre aléatoire avant de faire le modulo avec Min/Max?
la formule fonctionne de la même manière dans tous les langages?
(les langages dont la formule m'intéresse le plus sont: actionscript, java et C/C++)
Merci d'avance si vous conaissez la réponse à ma question =)

4 réponses

Utilisateur anonyme
9 oct. 2009 à 23:42
Salut,

L'aléatoire en C/C++ n'existe pas. En fait c'est un algorithme de génération de nombres pseudo-aléatoires qui sont liés les uns aux autres.

Donc un simple rand() renvoie toujours la même séquence. C'est pourquoi il faut utiliser srand() qui permet de trier ce tableau selon la graine (anglais->seed). Si tu mets une graine fixe tu auras encore et toujours la même séquence à chaque execution. L'intérêt de mettre la date,c'est qu'elle est toujours différente, sous Unix c'est le nombre de secondes depuis le 01/01/1970.

Pour actionscript et Java aucune idée =)
0
Dirby Messages postés 4 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 10 octobre 2009
10 oct. 2009 à 00:50
En fait c'est un algorithme de génération de nombres pseudo-aléatoires qui sont liés les uns aux autres. Peux tu développer plus concernat ces nombres merci d'avance;
0
Mais que renvoie exactement la fonction srand() alors?
comment l'ordinateur le calcule-t-il? (a partir de la date, oui, mais quelle formule utilise-t-il?)
voilà les questions que je me pose ^^

L'ordinateur utilise la date pour faire ses calculs. Mais si on effectue 2 fois la fonction srand() dans la même journée, on obtient malgré tout un résultat différent. Alors c'est basé sur les heures/minutes/secondes aussi?

Bref, j'aimerais bien comprendre en détail le fonctionnement de cette fonction =°

Si quelqu'un peut m'éclairer là-dessus, ca s'rait chouette :D
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 oct. 2009 à 10:23
Salut,

Mais que renvoie exactement la fonction srand() alors?
Rien. Le type de la fonction srand est void

       void srand(unsigned int seed);



Depuis man srand

La fonction srand() utilise son argument comme « graine » pour la génération d'une nouvelle séquence de nombres pseudo-aléatoires, qui seront fournis par rand(). Ces séquences sont reproductibles en appelant srand() avec la même valeur de graine.

Si aucune graine originale n'est fournie, la fonction rand() commence en utilisant la valeur 1.

0
Utilisateur anonyme
10 oct. 2009 à 10:33
Comme je l'ai dis, la fonction time() renvoie le nombre de secondes écoulées depuis le 01/01/1970, donc à chaque seconde de la journée le résultat est différent !!

La fonction rand() retourne un nombre pseudo-aléatoire compris entre 0 et 32767 (= constante RAND_MAX définie dans le fichier stdlib.h).

Ces nombres sont dits pseudo-aléatoires parce que, a priori, ils semblent aléatoires mais en fait ils sont calculés à partir d'un nombre de départ que l'on appelle la graine et qui démarre toujours à la même valeur (1) ce qui fait que l'on obtient toujours la même série de nombres "aléatoires" à chaque exécution.

Il existe donc la fonction srand() qui permet d'initialiser la fameuse graine de départ.

L'algorithme de rand est :
static	long	randx = 1;

srand(x)
unsigned x;
{
	randx = x;
}

rand()
{
	return(((randx = randx*1103515245 + 12345)>>16) & 077777);
}


Pour les opérateurs de cette fonction => https://www.commentcamarche.net/contents/191-langage-c-les-operateurs

Donc tu vois l'importance de cette graine !


Source : https://minnie.tuhs.org/cgi-bin/utree.pl
0