Nombre speudo aleatoire en c

cs_flofloo Messages postés 45 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 16 mars 2009 - 2 mars 2008 à 11:49
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 2 mars 2008 à 20:54
bonjouyr tout le monde...je voudrais tout simplement qu'on m'explique comment marche les nombre speudo a l'aleatoire?
 j'ai fait une petite recherche sur le sujet et on me parle de rand() et srand()
mais on me dit pas comment il fonctionne a vrai dire et moi je voudrais dans un de mes programme gerer des nombre aleatoire entre 1 et 9.
voila j'attend vos reponse en vous disant dejas merci

7 réponses

NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
2 mars 2008 à 12:46
[code]
#include <stdio.h>
#include <time.h>

main()
{
int a;
srand((unsigned int)time(0)); // initialise
a = 1+ (rand() % 10);   // nombre compris entre 1 et 9
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mars 2008 à 13:30
a = 1+ (rand() % 9);   // nombre compris entre 1 et 9

ciao...
BruNews, MVP VC++
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
2 mars 2008 à 13:35
Oups...
Exact BruNews !
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mars 2008 à 13:56
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 touours à la même valeur (certainement zéro j'imagine) ce qui fait que l'on obtient toujours la même série de nombres "aléatoires" à chaque exécution :

Le programme suivant :

#include <stdio.h>
#include <stdlib.h>
main()
{
   for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
   printf("\n");
}

donne (sur mon PC) la série suivante à chaque exécution :
 41 18467 6334 26500 19169 15724 11478 29358 26962 24464

Pour éviter ce problème (qui n'en ait pas forcément un car on peut vouloir obtenir la même série aléatoire à chaque exécution !), il existe la fonction srand() qui permet d'initialiser la fameuse graine de départ :

Le programme suivant :

#include <stdio.h>
#include <stdlib.h>
main()
{
   srand(1000);
   for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
   printf("\n");
}

donne la série suivante (différente de la précédente) à chaque exécution :
 3304 8221 26849 14038 1509 6367 7856 21362 6968 10160

Pour obtenir uune série qui ressemble vraiment à de l'aléatoire, l'astuce consiste à initialiser la graine avec la fonction time() (dans time.h) qui retourne l'heure du PC sous forme du nombre de secondes écoulées depuis le 1er janvier 1970 !!! Comme cela on obtient une graine différente à chaque exécution (à moins de réaliser l'initialisation 2 ou plusieurs fois dans la même seconde !) et donc des séries de nombres aléatoires différents :

Le programme suivant :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
   srand((unsigned int)time(NULL));
   for (int i=0 ; i<10 ; ++i) printf(" %d",rand());
   printf("\n");
}

donne maintenant une série différente à chaque exécution :
 23676 2545 31071 21600 21869 12870 31019 21473 7807 13205
 23745 31654 13003 2642 9100 29795 30845 25536 26871 15168
 23810 17246 9838 25156 18783 10026 27558 32526 29422 23278
 23879 13586 24538 6198 6013 26951 27383 3822 15718 25241
...

Le cast avec (unsigned int) est là parce que srand() attend une valeur de type unsigned int et que time() renvoie une valeur de type time_t. Le NULL dans time() est là parce qu'on ne veut pas stocker le compteur de secondes (sinon il y aurait l'adresse de la variable réceptrice).
 
Pour obtenir des nombres aléatoires compris entre un minimum et un maximum autres que 0 et 32767, il suffit de faire :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
   srand((unsigned int)time(NULL)
);
   int min = 10;
   int max = 20;
   for (int i=0 ; i<10 ; ++i) printf(" %d",(rand() % (max - min)) + min);
   printf("\n");
}

Exemple :
 12 19 13 11 19 11 13 19 19 19

Voilà !!!

Jean-François
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mars 2008 à 13:59
Petite précision sémantique :
rand() contraction de random aléatoire, hazard.
srand() contraction de seed et de random, seed graine.

Jean-François
0
cs_flofloo Messages postés 45 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 16 mars 2009
2 mars 2008 à 20:10
jfrancois mais vraiment mais thanks
god bless you man
merci autre aussi
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mars 2008 à 20:54
Merci ! mais j'ai fais une petite erreur ! corrigée ci-dessous. Sinon on ne génère jamais la valeur max.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
   srand((unsigned int)time(NULL));
   int min = 10;
   int max = 20;
   for (int i=0 ; i<10 ; ++i) printf(" %d",(rand() % ( + 1
);
   printf("\n");
}

Jean-François
0
Rejoignez-nous