begin process at 2012 02 12 23:53:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

nombre speudo aleatoire en c


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

nombre speudo aleatoire en c

dimanche 2 mars 2008 à 11:49:49 | nombre speudo aleatoire en c

flofloo

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
dimanche 2 mars 2008 à 12:46:02 | Re : nombre speudo aleatoire en c

NairodDorian

[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
}
dimanche 2 mars 2008 à 13:30:32 | Re : nombre speudo aleatoire en c

BruNews

Administrateur CodeS-SourceS
a = 1+ (rand() % 9);   // nombre compris entre 1 et 9


ciao...
BruNews, MVP VC++
dimanche 2 mars 2008 à 13:35:59 | Re : nombre speudo aleatoire en c

NairodDorian

Oups...
Exact BruNews !
dimanche 2 mars 2008 à 13:56:35 | Re : nombre speudo aleatoire en c

jfrancois

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

dimanche 2 mars 2008 à 13:59:54 | Re : nombre speudo aleatoire en c

jfrancois

Petite précision sémantique :

rand() = contraction de random = aléatoire, hazard.

srand() = contraction de seed et de random, seed = graine.

Jean-François

dimanche 2 mars 2008 à 20:10:45 | Re : nombre speudo aleatoire en c

flofloo

jfrancois mais vraiment mais thanks
god bless you man
merci autre aussi
dimanche 2 mars 2008 à 20:54:56 | Re : nombre speudo aleatoire en c

jfrancois

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() % (max - min + 1)) + min
);
   printf("\n");
}



Jean-François



Cette discussion est classée dans : nombre, aleatoire, speudo


Répondre à ce message

Sujets en rapport avec ce message

generation nombre aleatoire sous dev cpp [ par dionysos ] Bonjour,En c, sous dev cpp, comment generer des nombre de façon aleatoire (entiers) ?Quelle(s) bibliotheque(s)?Quelle(s) fonction(s)?J'ai pensé à rand Generateur de nombre aleatoire non determinée. [ par SnOOpss ] Bonjour je suis a la recherche d'un generateur de nombre aleatoire utilisant un phenomene physique de l'ordinateur. Sur ce site j'en ai trouvé un qui Nombre aleatoire [ par samaie ] Bonsoir j'ai un petit exercice que je n'arrive pas a faire.Il faut creer un nombre float aleatoire entre 0(inclu) et 1 (exlu).Si quelqu'un pourrai m'a Nombre aleatoire [ par BastienL21 ] Bonjour à tous,    Je développe actuellement une bataille navale en console. Pour placer les bateaux du PC et les tirs du pc, il faut que je crer un n probleme de comparaison QString/int [ par Kelm0 ] Bonjour je voudrais juste savoir comment on converti un nombre (int) en un QString (c'est peut-être pas la solution ...).Mon problème : j'ai génére un Extraction de nombre [ par hurtrelleg ] Bonjour,je cherche a extraire d'une chaine de caractère contenant des chiffres, des lettres et des caractères spéciaux uniquement les chiffres.Par exe [C++] Tuto N°2 erreur introuvable :s [ par DevilBTB ] Salut!J apprend le C++, et j ai les bases des bases du C.Je suivais un tuto pour apprendre d autre fonction et instruction, et j ai essayer de faire l conversion nombre réel [ par bessouma06 ] bonjour à tousje cherche comment convertirun nombre réel  en un chaine de caractére.j'ai trouvé ce code sur ce site mais qui tien compte seulement  de tableau/ vecteur [ par moberol ] Bonjour à tous !je suis debutant en C++, si quelqu'un peux me donner une idée;soit le fichier ci dessous,Module A   (....)intput 2;output <font size Exécuter une fonction différente à chaque tour de boucle [ par boudafc ] Bonjour,je vous expose mon problème:Je dispose de 6 méthodes permettant d'accéder à des champs (Text Fields sur une IHM IlogView) de type:Fonction1();


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales