Problème avec rand() en C
Fermé
balraux
Messages postés
3
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
19 juillet 2008
-
19 juil. 2008 à 12:42
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 19 juil. 2008 à 14:46
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 19 juil. 2008 à 14:46
2 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
19 juil. 2008 à 14:01
19 juil. 2008 à 14:01
Pour tout savoir sur le fonctionnement de rand :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/rand.3.html
Pour l'histoire de la suite aléatoire je suis d'accord, et pour peu que le motif se répète de sorte à ce que tu n'aies jamais simultanément 12 fois le chiffre 1 est théoriquement possible mais ça me paraît louche comme explication.
Si effectivement la boucle ne prend fin que quand les 12 dés sont égaux à 1 tu risques d'attendre un sacré moment avant que ça arrive.
À noter qu'en boost (une librairie libre écrite en C++) il existe d'autres générateurs aléatoires. Chez moi (sous linux) le programme marche avec NBRDE égal à 10 mais pas 12.
Quelques corrections :
- rajoute "int" devant main (type de retour)
- remplace system("pause"); par getchar();
- supprime la variable c
- pour afficher le long long int c'est plutôt %lli
- les tirages se font entre 0 et 5 (et non entre 1 et 6)
Quelques conseils :
- indente ton code
- donne des noms de variables explicites
- au lieu d'arrêter tes boucles à <= REP - 1 tu peux tout simplement écrire < REP
Le programme corrigé :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/rand.3.html
Pour l'histoire de la suite aléatoire je suis d'accord, et pour peu que le motif se répète de sorte à ce que tu n'aies jamais simultanément 12 fois le chiffre 1 est théoriquement possible mais ça me paraît louche comme explication.
Si effectivement la boucle ne prend fin que quand les 12 dés sont égaux à 1 tu risques d'attendre un sacré moment avant que ça arrive.
À noter qu'en boost (une librairie libre écrite en C++) il existe d'autres générateurs aléatoires. Chez moi (sous linux) le programme marche avec NBRDE égal à 10 mais pas 12.
Quelques corrections :
- rajoute "int" devant main (type de retour)
- remplace system("pause"); par getchar();
- supprime la variable c
- pour afficher le long long int c'est plutôt %lli
- les tirages se font entre 0 et 5 (et non entre 1 et 6)
Quelques conseils :
- indente ton code
- donne des noms de variables explicites
- au lieu d'arrêter tes boucles à <= REP - 1 tu peux tout simplement écrire < REP
Le programme corrigé :
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #define NOMBRE_DES 6 #define NOMBRE_JEUX 10 int main(){ int valeur_de,nb_des_1,j,somme,moyenne; float pct_effectue,idx_jeu; long long nb_essais; somme = 0; srand(time(NULL)); for(idx_jeu = 0;idx_jeu < NOMBRE_JEUX;++idx_jeu){ nb_des_1 = 0; nb_essais = 0; pct_effectue = 100*idx_jeu/(NOMBRE_JEUX-1); printf("%.2f %% effectues\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",pct_effectue); while(nb_des_1 != NOMBRE_DES){ ++nb_essais; nb_des_1 = 0; for(j = 0;j < NOMBRE_DES ;++j){ valeur_de=(int)((double)rand() / ((double)RAND_MAX) * 6) + 1; printf("%d",valeur_de); if(valeur_de == 1) ++nb_des_1; } printf("\n"); } printf("\nnombre d'essais = %lli\n",nb_essais); somme = somme + nb_essais; moyenne = somme / NOMBRE_JEUX; } printf("\n\nsomme = %d\n",somme); printf("moyenne = %d\n",moyenne); printf("temps de calcul: %.3f secondes\n",((double) clock())/1000); getchar(); return 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 569
19 juil. 2008 à 14:46
19 juil. 2008 à 14:46
Salut,
voir aussi Générer des nombres aléatoires efficacement avec rand
voir aussi Générer des nombres aléatoires efficacement avec rand