Aléatoire en C

Fermé
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009 - 12 sept. 2008 à 15:24
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009 - 12 sept. 2008 à 16:05
Bonjour,

J'ai déjà pas mal regardé sur le net, mais je n'ai pas trouvé de réponse qui me satisfaisait. Voilà mon problème:

L'idée est de trouvée un nombre moyen de coups pour réaliser une certaine expérience (par exemple, combien faut-il de coups en moyenne avant d'obtenir 3 fois le nombre 6 d'affilée sur un dé).

Je décide de faire l'expérience disons, 100 fois, à l'aide d'une boucle for. A l'intérieur de celle-ci, j'appelle la fonction srand(time(NULL) puis (à l'intérieur d'une nouvelle boucle) rand(). Le problème, c'est que l'ordinateur effectue l'expérience trop vite, et quand il retourne dans la 1ere boucle for, le temps n'a pas changé d'une seconde, et il effectue une nouvelle fois la seconde boucle for avec la même "initialisation" de la fonction rand().

J'obtiens donc une sortie sur ma console:

Le nb de coups avant d'obtenir 3 six est : 167
Le nb de coups avant d'obtenir 3 six est : 167
Le nb de coups avant d'obtenir 3 six est : 167
Le nb de coups avant d'obtenir 3 six est : 167

(Il faudrait que ça change pour pouvoir faire une moyenne!)

J'ai essayé de ne pas prendre le temps comme graine pour rand(), par exemple le nb de tours de mon processeur, mais ça ne marche pas non plus...

J'espère que j'ai été quand même assez clair, mais je sais qu'il faut s'accrocher pour bien comprendre...
Une solution?

Merci d'avance à tous!

8 réponses

barbouille94 Messages postés 30 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 septembre 2008
12 sept. 2008 à 15:28
Salut Melreg,

il te suffit tout simplement d'initialiser la séquence de ton générateur pseudo aléatoire (la ligne srand(time(NULL)) une seule fois au début de ton programme.

Effectivement si tu mets ton init dans ta boucle de 100 tu a de grande chance de partir du même endroit dans ta séquence (ce qui semble être le cas).

Barbouille
0
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009
12 sept. 2008 à 15:37
C'est ce que je pensais Brabouille.
Je l'ai mis en-dehors, mais c'est pareil, j'obtiens chaque fois la même valeur... c'est bizarre!
Tu veux que je poste mon code?
0
barbouille94 Messages postés 30 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 septembre 2008 > melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009
12 sept. 2008 à 15:47
Por le code, oui je veux bien que tu le mettes.
0
PeterPeterPeter Messages postés 202 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 22 juin 2010 30
12 sept. 2008 à 15:31
J'ai une solution, un peu barbare mais ça marche, vu que c'est juste pour un petit test, niveau optimisation on s'en fout !

En gros rajoute un
usleep(20);
dans ta boucle for, cette fonction fera dodo pendant un très court laps de temps !

Essaye de voir pour une valeur exacte je ne sais plus ce que j'avais mis dans mon cas.

edit : et oui comme dit au dessus, le srand() c'est mieux de l'initialiser une fois puis c'est tout !
0
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009
12 sept. 2008 à 15:40
J'ai essayé avec usleep, mais ça ne marche pas non plus...
0
PeterPeterPeter Messages postés 202 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 22 juin 2010 30
12 sept. 2008 à 15:41
Tu peux montrer ton code stp ?

Comme ça je vais faire des test en même temps pour voir.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009
12 sept. 2008 à 15:48
Euh... là, j'ai l'air bête, j'avais oublié une remise à zéro... aie!!!
Merci pour votre aide, elle n'aura pas été inutile puisque j'ai fini par trouvé et aussi parce que j'en ai appris plus sur la fonction srand.

Merci
0
barbouille94 Messages postés 30 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 septembre 2008
12 sept. 2008 à 15:54
le test, je viens de le voir ... ;))
0
barbouille94 Messages postés 30 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 septembre 2008
12 sept. 2008 à 15:56
Plus les erreurs sont grosses et moins on les voit ... et bien souvent il suffit d'exposer le problème pour trouver tout seul !!

Je parle par expérience ;))
0
melreg Messages postés 40 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 19 mars 2009
12 sept. 2008 à 16:05
C'est vrai barbouille! En tout cas, merci!
0