(java)petit programme de lotterie
Balthazar2
Messages postés
138
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je voulais par curiosité faire un tout petit programme pour avoir une idée précise de combien d'essaie il me faudrait pour avoir une sélection de lotterie gagnante :p
Seulement quand j'exécute mon programme, rien ne se passe :(
J'ai beau me relire, je ne vois pas trop ou j'ai merdé :(
Je voulais par curiosité faire un tout petit programme pour avoir une idée précise de combien d'essaie il me faudrait pour avoir une sélection de lotterie gagnante :p
Seulement quand j'exécute mon programme, rien ne se passe :(
package lotterie;
public class lotto649 {
public static void main(String[] args)
{
int selectionGagnante[] = new int[6];
int maSelection[] = new int[6];
int i = 0;
int cptSelectionPerdante = 0;
boolean gagnant = false;
selectionGagnante[0] = 7;
selectionGagnante[1] = 10;
selectionGagnante[2] = 16;
selectionGagnante[3] = 25;
selectionGagnante[4] = 31;
selectionGagnante[5] = 40;
while(!gagnant)
{
gagnant = true;
for(i =0;i<6;i++)
{
maSelection[i] = 1 + (int)(Math.random() * 49 );
}
for(i = 0;i<6;i++)
{
if(maSelection[i] != selectionGagnante[i])
{
gagnant = false;
cptSelectionPerdante++;
break;
}
}
}
System.out.println("Il a fallu " + cptSelectionPerdante + "Pour gagner");
}
}
J'ai beau me relire, je ne vois pas trop ou j'ai merdé :(
A voir également:
- (java)petit programme de lotterie
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
4 réponses
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 :(.
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 :(
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...