Bug dans mon système aléatoire (random)

Résolu/Fermé
cindylechat Messages postés 24 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 21 décembre 2016 - Modifié par jordane45 le 16/12/2016 à 18:35
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 16 déc. 2016 à 21:37
Bonjour,

Je programme en c# WinForms, et j'ai un bug avec mon programme, je me demande si quelqu'un peut m'aider à trouver le problème.

Donc voilà, je fais un programme style quiz afin d'apprendre les notes sur une guitare. Il y a une corde de donnée ainsi qu'une note. L'utilisateur doit répondre aux questions avec la position de cette note sur la corde. Alors, j'ai créé un système aléatoire pour poser des questions aléatoires.

Mon problème: mon système aléatoire ne fonctionne pas correctement. Les possibilités sont les suivantes: 5 cordes (A, B, D, E, G) , 7 notes en notation anglaise (A, B, C, D, E, F, G). Pourtant, mon système ne me sort que les combinaisons suivantes (corde, note): (A, A) , (A, B), (B, B), (B, C), (D, C), (D, D), (E, D), (E, E), (G, F) et (G,G).

Il doit y avoir quelque chose que j'ai mal écrit, et j'ai cherché et je ne trouve vraiment pas la solution à mon problème.

Voici mon code:
//Prend une corde au hasard
string[] tableauCorde = { "A", "B", "D", "E", "G" };
Random rnd1 = new Random();
int iCorde = rnd1.Next(5);

string corde = tableauCorde[iCorde];

etq_quelle_corde.Text = corde;

//L'utilisateur répond avec des frets
if (bFret)
 {

//Prend une note au hasard
 string[] tableauNote = { "A", "B", "C", "D", "E", "F", "G" };
 Random rndnote = new Random();
 int iNote = rndnote.Next(7);
string note = tableauNote[iNote]
;
 etq_quelle_note.Visible = true;
 etq_quelle_note.Text = note;
 }


EDIT : Ajout des balises de code

Merci d'avance.

2 réponses

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
16 déc. 2016 à 21:00
Je viens d'essayer ça

           List<string> combinaisons = new List<string>();

            Random rnd1 = new Random();
            for (int i = 0; i < 20; i++)
            {
                string[] tableauCorde = { "A", "B", "D", "E", "G" };
                int iCorde = rnd1.Next(5);

                string corde = tableauCorde[iCorde];

                if (true)
                {

                    //Prend une note au hasard
                    string[] tableauNote = { "A", "B", "C", "D", "E", "F", "G" };
                    int iNote = rnd1.Next(7);

                    string note = tableauNote[iNote];

                    combinaisons.Add(string.Format("Code : {0}, Note {1}", corde, note));
                }
             }
             string resultatForum = string.Join("\r\n", combinaisons);


J'ai enlevé les contrôles, que je n'ai pas et j'ai fait une boucle pour avoir 20 combinaisons.
Le random est bien déclaré pour une portée supérieure et il n'y en un bien un seul d'utiliser pour mes 20 combinaisons, soit 40 tirages.

1ere exécution

Code : B, Note G
Code : B, Note B
Code : E, Note E
Code : A, Note C
Code : A, Note G
Code : D, Note E
Code : B, Note G
Code : A, Note G
Code : D, Note F
Code : G, Note A
Code : B, Note A
Code : A, Note C
Code : G, Note B
Code : E, Note D
Code : A, Note B
Code : G, Note B
Code : E, Note G
Code : A, Note C
Code : A, Note F
Code : A, Note A


2eme exécution

Code : B, Note E
Code : G, Note C
Code : A, Note A
Code : D, Note F
Code : D, Note F
Code : G, Note C
Code : G, Note D
Code : D, Note A
Code : D, Note F
Code : A, Note A
Code : E, Note C
Code : D, Note D
Code : D, Note F
Code : D, Note D
Code : D, Note B
Code : A, Note C
Code : D, Note D
Code : E, Note B
Code : E, Note E
Code : A, Note C


Donc à priori, j'ai un peu tout et pas dans le même ordre.
1
cindylechat Messages postés 24 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 21 décembre 2016 6
16 déc. 2016 à 21:05
Merci énormément, cela fonctionne correctement!
Merci d'avoir pris le temps de m'aider !

Bonne fin de soirée :)
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
Modifié par Whismeril le 16/12/2016 à 21:38
Alors il faut savoir qu'un random n'est pas vraiment aléatoire, et que sa séquence dépend de comment il est initialisé.
Il possède d'ailleurs 2 constructeurs, le deuxième prend un int en paramètre et il est conseillé d'utiliser quelque chose qui change, l'heure par exemple.

Et donc, en utilisant autant de random que de tirage, tu as de grandes chances d'avoir des début de séquences identiques.

Si ça te convient, merci de marquer le sujet résolu avec le lien dédié, juste en dessous du titre de la discussion. Idem pour la précédente.
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
16 déc. 2016 à 19:19
Bonsoir

pour que ton code soit lisible sur le forum, merci d'utiliser la coloration syntaxique, voir la procédure ici. Pour cette fois, j'ai demandé à la modération d'éditer ton message. Merci Jordane.

Concernant ton soucis

Essaye de mettre ton random global sur la classe.
Tu fais un Next pour la corde et un Next pour la note
0
cindylechat Messages postés 24 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 21 décembre 2016 6
16 déc. 2016 à 19:31
Qu'est-ce que tu veux dire ? J'ai déjà mis un Next pour la corde et un autre pour la note ?!
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
16 déc. 2016 à 19:35
Non, tu as créé deux randoms, je te propose (ça n'est peut être pas la solution) de n'en utiliser qu'un seul pour les deux.
Il faut juste veiller à ce que sa portée le permette.
0
cindylechat Messages postés 24 Date d'inscription mercredi 14 décembre 2016 Statut Membre Dernière intervention 21 décembre 2016 6
Modifié par cindylechat le 16/12/2016 à 19:42
J'ai testé avec cela:

J'ai toujours le même problème..




//Prend une corde au hasard
string[] tableauCorde = { "A", "B", "D", "E", "G" };
Random rnd1 = new Random();
int iCorde = rnd1.Next(5);

 string corde = tableauCorde[iCorde];

 etq_quelle_corde.Text = corde;

 if (bFret)
{

//Prend une note au hasard
string[] tableauNote = { "A", "B", "C", "D", "E", "F", "G" };
 int iNote = rnd1.Next(7);

string note = tableauNote[iNote];

 etq_quelle_note.Visible = true;
  etq_quelle_note.Text = note;
                }
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
16 déc. 2016 à 21:03
Tu dois faire
Random rnd1 = new Random();
une seule fois, pas chaque fois que tu recherches une nouvelle combinaison.
0