(java)petit programme de lotterie
Fermé
Balthazar2
Messages postés
138
Date d'inscription
mardi 16 octobre 2012
Statut
Membre
Dernière intervention
29 janvier 2016
-
19 avril 2014 à 23:59
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 avril 2014 à 12:36
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 26 avril 2014 à 12:36
A voir également:
- (java)petit programme de lotterie
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Programme demarrage windows 10 - Guide
4 réponses
iBestBaker
Messages postés
24
Date d'inscription
samedi 1 juin 2013
Statut
Membre
Dernière intervention
11 septembre 2014
1
20 avril 2014 à 00:04
20 avril 2014 à 00:04
tu le fait comment sa ???
Balthazar2
Messages postés
138
Date d'inscription
mardi 16 octobre 2012
Statut
Membre
Dernière intervention
29 janvier 2016
2
20 avril 2014 à 00:13
20 avril 2014 à 00:13
Je ne gagne pas pour vrai
Je me suis choisi une sélection gagnante de 6 chiffre allant de 1 à 49 et j'ai voulu savoir combien d'essai il faut à mon programme pour avoir ces 6 chiffres en lui en faisant choisir 6 de 1 à 49 aleatoirement.
il semble que la probabilité qu'il réussisse soit tellement infime, que sa prend 20 ans avant qu'il se termine :(.
Je me suis choisi une sélection gagnante de 6 chiffre allant de 1 à 49 et j'ai voulu savoir combien d'essai il faut à mon programme pour avoir ces 6 chiffres en lui en faisant choisir 6 de 1 à 49 aleatoirement.
il semble que la probabilité qu'il réussisse soit tellement infime, que sa prend 20 ans avant qu'il se termine :(.
Balthazar2
Messages postés
138
Date d'inscription
mardi 16 octobre 2012
Statut
Membre
Dernière intervention
29 janvier 2016
2
20 avril 2014 à 03:37
20 avril 2014 à 03:37
400 million d'essaie avant qu'il réussisse à avoir mes 6 chiffres :O
je vivrais 500 000 ans en jouant tous les jours et je serais encore loin du compte, chaud quand même :(
je vivrais 500 000 ans en jouant tous les jours et je serais encore loin du compte, chaud quand même :(
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
26 avril 2014 à 12:36
26 avril 2014 à 12:36
Bonjour,
Il n'est pas nécessaire pour connaître le résultat de faire le test avec les valeurs réelles. Le problème est en fait simple, tu joues 1 grille pour N combinaisons possibles.
Regarde ce qu'il se passe pour de petites valeurs de N, tu pourras facilement en déduire ce qu'il se passe avec la vraie valeur de N=49*48*47*46*45*44≈10^10
Remarque : comme ce calcul est aléatoire, il n'est pas pertinent de le faire tourner une seule fois, tu pourrais très bien gagner du premier coup, comme jamais...
Voici donc comment faire un peu de statistiques, que l'on copieras ensuite dans Excel pour tracer le graphique.
Voici le résultat obtenu :
Remarque : le résultat s'explique très facilement d'un point de vue mathématique.
Tu as une chance sur N de gagner la première fois.
De même tu as une chance sur N de gagner la seconde fois, sauf que tu n'as pas joué si tu avais gagné la première fois, du coup cela représente (N-1)/N (de ne pas avoir gagné la première fois) * 1/N = (N-1)/N².
De même tu as (N-1)^k/N^(k+1) chances de gagner la kème fois.
Ce qui va en diminuant puisqu'au fur et à mesure tu as la chance de gagner.
En fait il serait plus intéressant de le cumuler, pour savoir quelle est la probabilité d'avoir gagné AVANT le kème tirage.
Au final je ne fais que réinventer les maths, mais avec des petits tests comme ça (rappel : je suis à N=10) ça me permet de retrouver intuitivement la formule.
La probabilité d'avoir gagné au kè tirage est de 1-[(N-1)/N]^k
Par exemple, pour k=1, on retrouve bien la probabilité 1/N de gagner.
Et pour aller un peu plus loin, je veux chercher au bout de combien de tirage ma probabilité d'avoir gagné est P. Alors il suffit de résoudre 1-[(N-1)/N]^k=P
Ce qui donne K = log(1-P) / [log(N-1) - log(N)].
Pour N=10, on retrouve bien les résultats générés en Java, à savoir que si on veut une chance sur deux de gagner le gros lot, il faut jouer 6 ou 7 fois.
Pour les valeurs réelles on ne fera évidemment pas le test en Java, mais on réutilise la formule obtenue grâce aux recherches avec N=10.
Le graphique a de toute façon la même tête, seules les valeurs changent :
Bilan : statistiquement pour avoir une chance sur deux de gagner un jour il faudrait jouer 7 milliards de fois, pour avoir une chance sur mille de gagner un jour il faudrait jouer 10 millions de fois. Plus raisonnablement si tu joues 1000 fois, tu as une chance sur 10 millions de toucher le gros lot... bon courage ^^
Conclusion : pas besoin de faire en Java ces calculs avec de grosses valeurs, tu obtiendras de bien meilleurs résultats avec des petites valeurs qui te mèneront tout droit vers le même résultat mathématique.
Remarque au passage, tu peux faire les tests en Java d'au lieu de choisir toujours la même valeur gagnante "m" de choisir à la place toujours une valeur aléatoire. Tu remarqueras que tes chances de gagner sont les même...
Il n'est pas nécessaire pour connaître le résultat de faire le test avec les valeurs réelles. Le problème est en fait simple, tu joues 1 grille pour N combinaisons possibles.
Regarde ce qu'il se passe pour de petites valeurs de N, tu pourras facilement en déduire ce qu'il se passe avec la vraie valeur de N=49*48*47*46*45*44≈10^10
import java.util.Random; public class Test { public static void main(String[] args) { Random random = new Random(); // nombre de combinaisons possibles int n = 10; // ma combinaison int m = random.nextInt(n); for (int i=1;;i++) { // combinaison aléatoire du tirage int a = random.nextInt(n); // si on gagne if (a==m) { System.out.println("Gagné en "+i+" coups"); break; } } } }
Remarque : comme ce calcul est aléatoire, il n'est pas pertinent de le faire tourner une seule fois, tu pourrais très bien gagner du premier coup, comme jamais...
Voici donc comment faire un peu de statistiques, que l'on copieras ensuite dans Excel pour tracer le graphique.
package ccm.kx.test; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.TreeMap; public class Test { public static void main(String[] args) { Random random = new Random(); // nombre de combinaisons possibles int n = 10; // ma combinaison int m = random.nextInt(n); Map<Integer, Integer> stats = new TreeMap<Integer, Integer>(); // on fait le test 1 million de fois for (int z=0; z<1000000; z++) { for (int i=1;;i++) { // combinaison aléatoire du tirage int a = random.nextInt(n); // si on gagne if (a==m) { // On ajoute 1 à la stats i Integer cpt = stats.get(i); stats.put(i, cpt==null ? 1 : cpt+1); break; } } } // affichage pour copier coller dans Excel for (Entry<Integer, Integer> e : stats.entrySet()) System.out.println(e.getKey()+"\t"+e.getValue()); } }
Voici le résultat obtenu :
Remarque : le résultat s'explique très facilement d'un point de vue mathématique.
Tu as une chance sur N de gagner la première fois.
De même tu as une chance sur N de gagner la seconde fois, sauf que tu n'as pas joué si tu avais gagné la première fois, du coup cela représente (N-1)/N (de ne pas avoir gagné la première fois) * 1/N = (N-1)/N².
De même tu as (N-1)^k/N^(k+1) chances de gagner la kème fois.
Ce qui va en diminuant puisqu'au fur et à mesure tu as la chance de gagner.
En fait il serait plus intéressant de le cumuler, pour savoir quelle est la probabilité d'avoir gagné AVANT le kème tirage.
int cumul = 0; // affichage pour copier coller dans Excel for (Entry<Integer, Integer> e : stats.entrySet()) { cumul += e.getValue(); System.out.println(e.getKey()+"\t"+cumul); }
Au final je ne fais que réinventer les maths, mais avec des petits tests comme ça (rappel : je suis à N=10) ça me permet de retrouver intuitivement la formule.
La probabilité d'avoir gagné au kè tirage est de 1-[(N-1)/N]^k
Par exemple, pour k=1, on retrouve bien la probabilité 1/N de gagner.
Et pour aller un peu plus loin, je veux chercher au bout de combien de tirage ma probabilité d'avoir gagné est P. Alors il suffit de résoudre 1-[(N-1)/N]^k=P
Ce qui donne K = log(1-P) / [log(N-1) - log(N)].
Pour N=10, on retrouve bien les résultats générés en Java, à savoir que si on veut une chance sur deux de gagner le gros lot, il faut jouer 6 ou 7 fois.
Pour les valeurs réelles on ne fera évidemment pas le test en Java, mais on réutilise la formule obtenue grâce aux recherches avec N=10.
Le graphique a de toute façon la même tête, seules les valeurs changent :
Bilan : statistiquement pour avoir une chance sur deux de gagner un jour il faudrait jouer 7 milliards de fois, pour avoir une chance sur mille de gagner un jour il faudrait jouer 10 millions de fois. Plus raisonnablement si tu joues 1000 fois, tu as une chance sur 10 millions de toucher le gros lot... bon courage ^^
Conclusion : pas besoin de faire en Java ces calculs avec de grosses valeurs, tu obtiendras de bien meilleurs résultats avec des petites valeurs qui te mèneront tout droit vers le même résultat mathématique.
Remarque au passage, tu peux faire les tests en Java d'au lieu de choisir toujours la même valeur gagnante "m" de choisir à la place toujours une valeur aléatoire. Tu remarqueras que tes chances de gagner sont les même...