Rechercher : dans
Par :

Limites de la fonction rand() en langage C

balraux, le 16 jui 2008 à 16:08:48 
 Signaler ce message aux modérateurs

Bonjour,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;

}

Configuration: Windows Vista
Internet Explorer 7.0

Meilleures réponses pour « Limites de la fonction rand() en langage C » dans :
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...