1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 39
    Points : 34
    Points
    34

    Par défaut Instances de classe à paramètres aléatoires

    Bonjour,

    Grand débutant en C# et de manière général en programmation, je commence à peine l’objet. N’hésitez donc pas à me rappeler à l’ordre si je m’embrouille dans les notions, les termes ou si vous voyez des choses disgracieuses et des mauvaises habitudes dans mon code ^^

    Pour jouer avec les objets j’effectue quelques tests pour mettre en pratiques les notions que j’apprends.

    Dans le cas présent un vendeur possède un étal comprenant 6 fruits (et légumes) différents. Ces fruits sont générés aléatoirement, avec trois propriétés : le type (pommes ou poires par exemple), la couleur et le statut (mûre ou vert par exemple).

    L’étal contenant les fruits est une liste contenant mes instances de fruits.

    A la création d’un fruit, le constructeur de la classe légume pioche aléatoirement parmi des listes et tableaux présents dans la classe les caractéristiques de mon futur fruit ou légume, grâce à la méthode Random.

    Problème : les propriétés à la sortie sont identiques pour tous les fruits. Si je relance le programme le résultat est différent mais les 6 fruits et légumes sont toujours identiques entre eux (6 pommes vertes puis 6 raisins jaunes).

    Voici mes 3 méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        class Program
        {
            static void Main(string[] args)
            {
                Vendeur Bob = new Vendeur(6);
     
                foreach (Legumes Legu in Bob.Liste_Legumes_Vendeur)
                {
                    Console.WriteLine("J'ai des " + Legu.Type + " de couleur " + Legu.Taille + " qui sont " + Legu.Statut);
                }
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public class Vendeur
        {
            public List<Legumes> Liste_Legumes_Vendeur = new List<Legumes>();
     
            public Vendeur(int List_lenght)
            {
                for (int i = 0; i < List_lenght; i++)
                {
                    Liste_Legumes_Vendeur.Add(new Legumes(i));
                }
            } 
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        public class Legumes
        {
            private List<string> Types_Liste = new List<string> { "Tomates", "Raisins", "Pommes", "Poires", "Poivrons" };
            private string[] Tailles_Liste = new string[] { "verte", "jaune", "rouge" };
            private string[] Statuts_Liste = new string[] { "verts", "mûres", "pourrits" };
     
            public string Type { get; set; }
            public string Taille { get; set; }
            public string Statut { get; set; }
     
            Random rnd = new Random();
     
            public Legumes(int i)
            {
                Type = Types_Liste[rnd.Next(0,Types_Liste.Count)];
                Taille = Tailles_Liste[rnd.Next(0,Tailles_Liste.Length)];
                Statut = Statuts_Liste[i % Statuts_Liste.Length];
            }
        }
    Quelqu’un aurait une idée d’où pourrai provenir cette erreur ?

    Notes : l'utilisation d'un modulo et entier pour le troisième paramètre me permet bien d'avoir des résultat qui changent, contrairement à ceux qui utilisent l'aléatoire. L'utilisation d'une liste et de deux tableaux pour stocker les paramètres possibles me sert juste à tester les deux versions.

    Merci pour votre patience ^^

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net et Delphi
    Inscrit en
    juillet 2002
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .Net et Delphi
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2002
    Messages : 640
    Points : 1 458
    Points
    1 458

    Par défaut

    Bonjour,

    Ton problème est lié au fait que tu créés une nouvelle instance de Random à chaque fois. Comme une instance de Random est basée sur l'horloge système et qu'elles sont créés quasiment simultanément, il y a de très forte chance qu'elles génèrent les mêmes nombres (pseudo) aléatoires : Explication Msdn
    Tu peux contourner ce problème facilement : voir cette discussion sur StackOverFlow

  3. #3
    Membre éclairé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mars 2013
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2013
    Messages : 240
    Points : 874
    Points
    874

    Par défaut

    Yop,

    Le problème vient du fait que tu instancies un nouveau Random à chaque légume. Si tu utilise qu'un seul objet Random pour tes objets tu auras de véritables valeurs aléatoire. Si tu veux le tester en modifiant un minimum ton code, déplace la déclaration de ton Random dans le constructeur de ton Vendeur (en dehors de la boucle) et passe le paramètre dans le constructeur de légume.

    Pour plus d'infos

    Momoth
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 395
    Points : 611
    Points
    611

    Par défaut

    Plutôt que d'avoir un constructeur qui crée un légume aléatoire tu devais utiliser un constructeur simple et utiliser une classe de fabrique pour générer aléatoirement des des légumes.

    Tu aurais un code qui ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var fb = new FabriqueLegume();
    var vendeur = new Vendeur();
    for(int i = 0; i < 6; ++i) vendeur.Etal.Add(fb.CreerLegumeAleatoire());

Discussions similaires

  1. déclarer en xaml un instance de classe avec paramètre
    Par TERRIBLE dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 15/08/2010, 17h08
  2. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance
    Réponses: 2
    Dernier message: 22/12/2005, 12h19
  3. Réponses: 2
    Dernier message: 09/10/2005, 16h35
  4. Instance de classes
    Par KymZen dans le forum Tkinter
    Réponses: 9
    Dernier message: 07/04/2005, 09h35
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo