Aléatoire en C
melreg
Messages postés
40
Date d'inscription
Statut
Membre
Dernière intervention
-
melreg Messages postés 40 Date d'inscription Statut Membre Dernière intervention -
melreg Messages postés 40 Date d'inscription Statut Membre Dernière intervention -
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!
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!
A voir également:
- Aléatoire en C
- Tirage au sort excel aléatoire sans doublon ✓ - Forum Excel
- Vlc lecture aléatoire - Forum Téléphones & tablettes Android
- Comment désactiver le mode aléatoire sur VLC? - Forum Lecteurs et supports vidéo
- Lecture aléatoire VLC - Forum Lecteurs et supports vidéo
- Diaporama aléatoire windows 10 - Forum Windows 7
8 réponses
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
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
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
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 !
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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?