Limite de rand() en C

Fermé
balraux Messages postés 3 Date d'inscription mercredi 16 juillet 2008 Statut Membre Dernière intervention 19 juillet 2008 - 17 juil. 2008 à 15:17
eee.eee Messages postés 69 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 15 septembre 2009 - 20 juil. 2008 à 00:48
Bonjour à tous,alors voila ma question:

J'ai un petit programme basé autour de la fonction rand() qui simule en fait un lancer de n dés
et qui retourne le nombre d'essais nécessaires avant de tomber sur un lancer où tous les dés
valent 1.
Aucun problème tant qu'on ne depasse pas un lancer de 11 dés, à partir de 12 dés le prog
tourne sans fin...
Pourtant jusqu'à 11 dés tout semble indiquer que le programme fonctionne "tres" bien.
ex: pour 11 dés, on répete 1000 fois le programme et on tombe sur une valeur moyenne
de 6^11 essais nécessaires (soit environ 363 000 000), ce qui tend vers la probabilité
mathématique d'un tel évènement.
C'est le même constat pour 10 dés, 9 dés etc...
Mais pour 12 dés on devrait trouver selon le meme principe une moyenne de 6^12 essais
(environ 2 200 000 000). Or le programme tourne sans fin, j'ai balisé le code, mais il ne
plante nul part! C juste qu'il ne tombe jamais sur 12 dés tous égaux à 1.
J'ai laissé tourner le programme jusqu'à 100 milliards de lancés et toujours rien.
Bref ya un problème.
Je soupconne la réinitialisation de la graine par srand(time(NULL)) qui doit me répeter un motif
certes très long mais un motif quand meme.
Je crois que cette réinitialisation se base sur l'heure en secondes de 1970 à nos jours.
C'est peut etre un facteur limitant dans mon cas.

Je compte sur vous, merci.


Voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
# define NBRDE 10
# define REP 10


main()
{
int a,b,c,j,somme,moy;
float p,k;

long long i;

float t;

somme=0;

srand(time(NULL));
for(k=0;k<=REP-1;k++)
{
b=0;
i=0;
p=k/(REP-1);

printf("%.2f %% effectues\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",p*100);

while(b!=NBRDE)
{
i++;

b=0;
for(j=0;j<=NBRDE-1;j++)
{
a=(int)((double)rand() / ((double)RAND_MAX + 1) * 6);
//printf("\na=%d",a);
if(a==1)
{
b++;
}
}
//printf("\n");
}



//printf("\nnombre d essais=%I64u\n",i);
//printf("\a");

somme=somme+i;
moy=somme/REP;

}
printf("\n\nsomme=%d\n",somme);
printf("moy=%d\n",moy);

t=clock();
printf("temps de calcul: %.3f secondes\n",t/1000);

system("pause");
return 0;

}

1 réponse

eee.eee Messages postés 69 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 15 septembre 2009 20
20 juil. 2008 à 00:48
Effectivement, il y a des chances que ce soit ton problème. Il te faut un générateur de nombre aléatoire et non pseudo aléatoire.
Regarde ce thread, il te donne des liens vers des facons de générer des nombres aléatoires:
http://www.commentcamarche.net/forum/affich 1193805 nombres aleatoires en informatique
0