Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : nombre speudo aleatoire en c [ Algorithme / Maths ] (flofloo)

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
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é 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 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 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 Problème pour compter un nombre de lettres [ par Schlaf ] Bonjour,alors voila je doit rédiger un script , voici l'énoncé:(tableau a 1 dimension):Écrire le script qui permet de saisir un mot et qui permet de d Compter le nombre de fois qu'apparait un caractère dans un AnsiString [C++Builder] [ par Damou56 ] Voilà comme l'indique le titre je voulais savoir si il y a une fonction ou autre permettant de compter un caractère passer en paramètre dans un AnsiSt Passage par adresse et tableau multidimensionnel [ par Shuugeki ] Bonjour, je dois pour mes cours créer une fonction comptant le nombre de chaque caractère de l'alphabet contenu dans un mot, j'utilise pour sauvegarde comment renvoier le nombre de digit en java [ par creepx ] bonjour,j'arrive pas a comprendre ce que faire la methode digit()on fait il faut que je retourne le nombre de digit qui constitue la variable d'instan Conversion chaîne en nombre [ par baham ] Bonjour à tous!  Je viens vous voir car je rencontre un problème ; je souhaite convertir une chaîne de caractère en un nombre à virgule (float, double compter le nombre de fois ou un processus apparait [ par bonapart002 ] Bonjour,j"utilise Borland c++ 5.01 Je voudrais un outil me permettant de compter le nombre de fois ou un processus "x.exe" apparait dans la liste des


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.