Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c#] Activité à rendre : Le loto

Génération des nombres aléatoires

Sujet résolu
    8 mars 2019 à 14:18:23

    Bonjour à vous. ^^

    Je suis confronté à un souci… Je suis actuellement occupé à suivre le cours suivant, Apprenez à développer en c#.

    Jusqu'à présent je m'en sortais à peu près bien, sauf qu'arrivé au travail à rendre, je rencontre un couac.

    - Je dois générer 7 nombres aléatoires et les ranger dans un tableau : fait.

    - Je dois faire en sorte que les nombres ne soient pas identiques : fait. Et ca m'a l'air de marcher, je n'ai pas encore eu de doublons en une 10aine d'exécutions.

    - Je dois générer des nombres compris entre 1 et 49 inclus : plantage total!

    Ma borne supérieure semble ne pas être respectée, je vois régulièrement des nombres au dessus de 49 (entre 1 et 2 par tirage), et je ne comprends pas pourquoi, si quelqu'un peut donc éclairer ma lanterne...

    Peut être que j'utilise mal le random?

    Je vous montre le code que j'ai produit :

    using System;
    using System.Collections.Generic;
    
    namespace cours
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] tirage = new int[7];
                Random aleatoire = new Random();
    
                for (int i = 0; i < tirage.Length; i++)
                {
                    bool dejaPresent = false;
                    do
                    {
                        int resultat = aleatoire.Next(1, 50);
                        foreach (int element in tirage)
                        {
                            if (element == resultat)
                            {
                                dejaPresent = true;
                            }
                        }
                        if (!dejaPresent)
                        {
                            tirage[i] = resultat;
                        }
                    } while (!dejaPresent);
                }
                foreach (int element in tirage)
                {
                    Console.WriteLine(element + '\n');
                }
            }
        }
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2019 à 14:44:55

      Bonjour,

       tu obtiens des valeurs supérieures à 49 avec ce code ? 

      Très étrange, tu saurais nous fournir le contenu du tableau lors de plusieurs exécutions pour qu'on ait un aperçu ?

      • Partager sur Facebook
      • Partager sur Twitter
        8 mars 2019 à 14:52:10

        Je crois que je viens de comprendre… serait-il possible que l'affichage seulement soit en cause?

        J'ai viré le '\n' que j'ajoutais (pour passer la ligne, ce qui est en plus inutile car writeline le fait d'office, vieille habitude des chaines en c++ lol)

        Du coup je ne rencontre a priori plus le souci...

        Serait-il possible que mon expression " element + '\n' " soit évaluée avant d'être affichée?

        • Partager sur Facebook
        • Partager sur Twitter
          8 mars 2019 à 14:54:14

          Salut,

          J'ai debuggé ton programme et la fonction aléatoire fonctionne bien, "resultat" ne prend jamais de valeur >50, mais l'affichage montre certaines valeurs >50

          Pour moi ca vient du fait que tu affiches tes valeurs INT sans .ToString(). J'ai modifié ta ligne 34 en "Console.WriteLine(element.ToString());" et cela ne s'est plus reproduit.

           Sinon tu devrais utiliser des List tu te prendrais moins la tête pour vérifier si un élement est déjà présent, parce que la niveau perfomance c'est vraiment pas ca :D

          En esperant t'avoir aidé

          EDIT : j'ai vu ta réponse, si cela ne se reproduit plus c'est que ca venait de là, étonnant cependant..

          -
          Edité par earp91 8 mars 2019 à 14:55:04

          • Partager sur Facebook
          • Partager sur Twitter
            8 mars 2019 à 15:32:25

            Juste pour appuyer le commentaire de @earp91 

            Dan ton exemple, je pense que c'est ce que tu fais. sachant que tu commence le WriteLine() par un int et que le caractère suivit est échappé (donc je suppose pas considéré comme un string).

            static void Main(string[] args)
                    {
                        int[] tirage = new int[7];
                        Random aleatoire = new Random();
                        bool dejaPresent = false;
            
                        for (int i = 0; i < tirage.Length; i++)
                        {  
                            do
                            {
                                dejaPresent = false;
                                int resultat = aleatoire.Next(1,49);
                                if (tirage.Contains(resultat)) dejaPresent = true;
                                if (!dejaPresent) tirage[i] = resultat; 
                            } while (dejaPresent);
                        }
                        foreach (int element in tirage)
                        {
                            Console.WriteLine(element.ToString());
                        }
                        Console.ReadKey();
                    }


            Du coup ce code marche correctement. 

            -
            Edité par WorstDevEver 8 mars 2019 à 15:34:22

            • Partager sur Facebook
            • Partager sur Twitter
              8 mars 2019 à 15:39:55

              J'ai appliqué également ce conseil, je mets cela dans un coin de ma tête!

              Merci à vous, sujet résolu! ^^

              • Partager sur Facebook
              • Partager sur Twitter

              [c#] Activité à rendre : Le loto

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown