(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
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 :(


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:

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
tu le fait comment sa ???
0
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
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 :(.
0
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
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 :(
0
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
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

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...
0