Bonjour, toujours dans mes premiers pas en c# et Poo.
Quand je crée mes animaux, je veux qu'ils aient 5 attributs obligatoirement connus.
Ce qui donne dans mon constructeur le plus simple:
La seule subtilité, c'est que je veux une affectation aléatoire du sexe selon un ratio M/F qui peut varier selon les espèces.
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 class Chien : MammifereTerrestre, IDomesticable, Inageant, IPopulationVariable { public Chien() { this.Id_guid = Guid.NewGuid(); this.vivant = true; this.sexe = Cl_St_MethodesPartagees.AffecterSexeAlea(50); this.dateCreation = DateTime.Now; if (this.sexe == 'F') { this.AppellationAnimal = "une chienne"; } //définition de l'appellation animal selon le sexe else { this.AppellationAnimal = "un chien"; } lstAnimaux.Add(this);} // peuplement de la faune dans la list static de la super Classe Animaux } }
J'ai donc créé ailleurs une fonction pour me fournir cela.
Cela marche très bien, circulez y'a rien à voir...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 static class Cl_St_MethodesPartagees { public static char AffecterSexeAlea(int proportionMaleSur100) { Random aleatoire = new Random(); int sexe = aleatoire.Next(100); if (sexe < proportionMaleSur100) return 'M'; else return 'F'; }
Sauf que j'ai une méthode qui me permet d'instancier un grand nombre d'animaux: public static void CreerSerieChiens(int nombre)
Et là ça foire lamentablement.
Que me dit MS ?
Bon, mon petit cerveau a fini par comprendre et trouver une solution:Éviter plusieurs instanciations
L’initialisation de deux générateurs de nombres aléatoires dans une boucle étroite ou en succession rapide crée deux générateurs de nombres aléatoires qui peuvent produire des séquences identiques de nombres aléatoires. Dans la plupart des cas, cela n’est pas intention du développeur et peut entraîner des problèmes de performances, car l’instanciation et initialisation d’un générateur de nombres aléatoires sont un processus relativement coûteux.
À la fois pour améliorer les performances et d’éviter de créer par inadvertance les générateurs de nombres aléatoires distincts qui génèrent des séquences numériques identiques, nous vous recommandons de créer un Random objet pour générer des nombres aléatoires au fil du temps, au lieu de créer de nouveaux Random objets pour générer un nombre aléatoire.
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 public static List<char> RenvoyerListSexesAleatoires(int nbreVoulu, int proportionMaleSur100) { List<char> listAlea = new List<char>(); char sx; int nbralea; Random rnd = new Random(); for (int i = 0; i < nbreVoulu; i++) { nbralea = rnd.Next(0, 100); if (nbralea < proportionMaleSur100) { sx = 'M'; } else { sx = 'F'; } listAlea.Add(sx); } return listAlea; }
A mon créateur de série de chiens de gérer cette liste. Il le fait très bien. Merci pour lui...
Mais je ne comprends toujours pas pourquoi initialiser en succession rapide des new Random() les fait générer des nombres identiques ? Quelque chose m'échappe...
Partager