Aide programme Random et logique

Bonjour a tous,

J'essaie depuis plusieurs jour de créer un programme qui va tirer une série de 10 numéros de 1 à 50.
Le premier tirage se passe bien
Le 2nd tirage se fait de 1 à 49 et j'incrémente la variable si elle est supérieur ou égal au 1er tirage.
Au 3ème tirage, sa commence a se compliquer car je tire un numéro 1 à 48 et j'incrémente la variable de 1 ou de 2 suivant la valeur des 2 premiers tirage.

Avez vous un idée de programme car je suis parti pour faire un programme avec principalement des if et des for
Sinon j'aurais voulu créer un tableau [50] = {1, .... , 50};
et melanger les numéros du tableau pour ainsi tirer les 10 premiers numéro de la liste. Je ne sais pas si c'est possible ?

Merci
Bonne journée

BossOfScandalz:
Sinon j'aurais voulu créer un tableau [50] = {1, .... , 50};
et melanger les numéros du tableau pour ainsi tirer les 10 premiers numéro de la liste. Je ne sais pas si c'est possible ?

Merci
Bonne journée

Bonjour

Ton problème s'apparente à un mélange de jeu de cartes.

Une solution simple :

  1. tu crées ton tableau à 50 entrées, initialisé à {1, ..., 50}
for (i=1;i<=50;i++) tableau[i-1] = i;
  1. tu mélanges le tableau en inversant le contenu de deux cases au hasard, en les sélectionnant par la fonction random.
    Pour une bonne répartition, il te faut un grand nombre d'inversions aléatoires.
    A vue de nez, je dirais qu'il faut un nombre d'inversions égal au carré du nombre de cases. Un matheux pourrait préciser cela.

Un truc du genre :

 for (int i=0; i<2500;i++)
{
  c1 = random(50);
  c2 = random(50);
  c = tableau[c1];
  tableau[c1] = tableau[c2];
  tableau[c2] = c;
}

Merci beaucoup pour ta réponse très rapide.

Je vais tester. Je te tiens au courant.

Bonjour,

J'ai testé le programme et ça fonctionne. Encore merci

En revanche la fonction random n'est pas vraiment random comme déjà annoncé sur le forum malgré la fonction randomSeed(analogRead(0));
testé sur 10 reset, je me retrouve avec 2 fois la même liste.

bonjour,
tu peux mettre en eeprom les numéros tirés.
au reset, tu lance la lecture de l'eeprom et mets en variables les nombres.
tu lance le random, vérifie si différent des variables.
si oui, inscrit dans l'eeprom
si non, tu relance un random tant que les nombres sont égaux aux variables.

BossOfScandalz:
En revanche la fonction random n'est pas vraiment random comme déjà annoncé sur le forum malgré la fonction randomSeed(analogRead(0));
testé sur 10 reset, je me retrouve avec 2 fois la même liste.

bonjour
mets un "bout de fil" d'une dizaine de centimetres en "antenne" sur le pin A0 et regarde si le pseudo randon s'ameliore.

Bonjour,

Merci pour vos solutions très intéressante.
Je vais faire l'essaie.

Bonne journée

Merci pepe

Avec les 3 solutions, si c'est pas aléatoire, je revend mon arduino :slight_smile:

Une question:
sur la ligne

seed <<= 1;

c'est la même chose que

seed << 1;

?

seed <<= 1;

est équivalent, en terme de résultat, à

seed = seed << 1;

Ok merci pour cette précision