Correction projet "tirage Loto" pour débutant.

Bonjour, j'ai décidé de me mettre à la programmation Arduino pour réaliser quelques projets qui m'aideraient bien, genre déclencheur d'électrovanne pour photographier des collisions de goutte, ou déclencheur d'APN pour photographier des éclairs, etc....! Je suis totalement débutant et j'ai voulu commencer par un petit projet : un tirage Loto genre FDj, avec 7 chiffres parmi 49 et en éliminant les doublons. Mon code fonctionne, mais j'aurais aimé avoir une correction pour savoir s'il y avait plus simple. merci de votre aide.
P.S : Ah oui , j'ai oublié, j'ai 62 ans :wink: .

long randNumber; // déclaration d'une variable long

void setup(){
  Serial.begin(9600); // initialise la connexion série vers le PC à 9600 bauds

 
  // initialisation de la fonction pseudo-aléatoire randomSeed() 

  randomSeed(analogRead(0));
}

void loop(){

  int tableau[] = {0, 0, 0, 0, 0, 0, 0}; //initialisation à 0 du tableau DE 7 CASES
 
  //  tirage des 7 chiffres de 1 à 49

    for(int i=0;i<=6; i++)
    {
  //  nombre aléatoire entre 1 et 49

  randNumber = random(1, 50);
      
       /*Comparaison des chiffres tirés avec les autres chiffres du tableau, le premier chiffre du tableau 
       n'est forcément pas un doublon car initialisé à zéro*/
      
      for(int j=0;j<=6; j++){
        	
        if ((randNumber) == tableau[j]){
      			
                randNumber = random(1, 50);  //re-tirage si chiffre en doublon dans tableau             
       		}// fin du if
        
     	 } // fin du for (j)       
      
  // remplir le tableau avec les chiffres tirés

      tableau[i]=(randNumber); 
      
           } //fin du for (i)
  
  //affiche le tableau rempli
  for(int i=0;i<=6; i++)
  {
        Serial.print (tableau[i]);
    	Serial.print ("-");
  } //fin du for (i)
  
  delay(1000); // pause de 1000 ms
  Serial.println();
  Serial.println("nouveau tirage");
  delay(1000); // pause de 1000 ms

} // fin de void loop

hello
ton code est bien fait
par contre, il y a une boulette:
lorsque tu controles si le nombre à déjà été choisi,
si c'est le cas, tu le re-choisi, mais tu ne recontrole pas si c'est encore le meme.
pour mettre en évidence, j'ai dans un premier temps fait
_classer les nombres en ordre croissant
_afficher les nombres
et pour mettre en évidence un problème qui ne doit pas arriver souvent, j'ai fermer la fourchette de choix du random. je l'ai passée de 1,50 à 1,10

si tu regardes la copie d'écran jointe, tu verras les chiffres acceptés en double.

long randNumber; // déclaration d'une variable long
int swap = 0;
void setup()
{
  Serial.begin(1000000); // initialise la connexion série vers le PC à 9600 bauds
  randomSeed(analogRead(0));
}

void loop()
{
  int tableau[] = {0, 0, 0, 0, 0, 0, 0}; //initialisation à 0 du tableau DE 7 CASES
  for (int i = 0; i <= 6; i++)
  {
    randNumber = random(1, 10);
    for (int j = 0; j <= 6; j++)
    {
      if ((randNumber) == tableau[j])
      {
        randNumber = random(1, 10);
      }
    }
    tableau[i] = (randNumber);
  }
  Serial.println("controle ");
  for (int i = 0; i <= 6; i++)
  {
    for (int j = i; j <= 6; j++)
    {
      if (tableau[i] > tableau[j])
      {
        swap = tableau[i]; tableau[i] = tableau[j]; tableau[j] = swap; Serial.print ("swap-");
      }
    } Serial.print(tableau[i]); Serial.print ("-");
  } Serial.println(" ");
  for (int i = 0; i <= 6; i++)
  {
    Serial.print (tableau[i]);
    Serial.print ("-");
  } //fin du for (i)
  delay(1000); // pause de 1000 ms
  Serial.println();
  Serial.println("nouveau tirage");
  delay(1000); // pause de 1000 ms
} // fin de void loop

Bon début, même si on met des commentaires sur des bugs de conception, c’est propre et documenté, vous êtes sur la bonne voie.

L’autre souci potentiel c’est que si vous n’avez pas de chance ça peut durer super longtemps si vous retombez toujours sur un chiffre déjà choisi. Essayez un tirage de 6 sur 7 par exemple et affichez le nombre d’essais.

Essayez ensuite un tirage de 99 sur 100 il risque de pédaler longtemps.

Une façon de faire un peu comme dans le jeu: c’est d’avoir un tableau des 50 "boules" (les nombres de 1 à 50) et de le mélanger (lire Mélange de Fisher-Yates). Cet algorithme a une complexité linéaire et donne toutes les permutations avec la même probabilité.

 Pour i allant de n − 1 à 1 faire :
       j ← entier aléatoire entre 0 et i
       échanger a[j] et a[i]

Une fois le tableau mélangé, vous prenez les 6 premiers éléments par exemple. Comme ils ont été mélangés c’est aléatoire et pas de risque de doublon, dans un temps connu proportionnel à la taille du tableau.

Inconvénient : ça mange 50 places mémoire et ça les mélange tous alors qu’au final on ne veut que les 6 premiers. Si on dit qu’on prend plutôt les 6 derniers, on peut alors simplifier l’algorithme pour ne faire que 6 tirages

 Pour i allant de n − 1 à n-6 faire :
       j ← entier aléatoire entre 0 et i
       échanger a[j] et a[i]

ensuite on prendra les éléments aux indices n-6 à n-1

Merci de vos retour, effectivement, je n'avais pas vu que je ne re-vérifiais pas le deuxième tirage, je vais analyser tout ça pour bien comprendre :wink:

Pour l'anecdote, il y'a une vingtaine d'années, je suis allé à un loto pour une fête d'école maternelle. Un instit avait réalisé un petit programme de tirage au sort comme le tien. Il s'est avéré qu'a chaque remise à zéro, les numéros sortaient dans le même ordre et c'était donc toujours les mêmes plaques qui gagnaient.... Ca a fini en grosse bagarre générale avec intervention de la police.....
J'espere qu'on sait mieux aujourd'hui gérer les random....

Tout ça pour dire : faut pas se planter avant de l'utiliser !!

Désolé pour la pourriture du post!

Ce serait le cas si on n’appelle pas analogSeed()...