/// <summary> /// Génère un arbre aléatoirement de taille (max - min + 1) /// </summary> /// <param name="rand">Générateur utilisé</param> /// <param name="freqEmbranchement">Fréquence relative des embranchements</param> /// <param name="freqTigeGauche">Fréquence relative des tiges gauches</param> /// <param name="freqTigeDroite">Fréquence relative des tiges droites</param> /// <param name="max">Valeur maximale dans l'arbre</param> /// <param name="min">Valeur minimale dans l'arbre</param> /// <param name="mult">Multiplicateur pour la valeur</param> /// <returns>Un arbre binaire aléatoire</returns> private static Noeud Arbre( this Random rand, int freqEmbranchement, int freqTigeGauche, int freqTigeDroite, int max, int min = 1, int mult = 1) { if (max < min) { throw new ArgumentOutOfRangeException(); } // Si max == min alors retourner une feuille if (max == min) { return(new Noeud(min * mult)); } int freqTotale = freqTigeGauche + freqTigeDroite; // S'il y a au moins 3 noeuds, alors on peut envisager un embranchement if (max - min > 1) { freqTotale += freqEmbranchement; } // Dans le cas rare ou la frequence totale est 0, // alors on choisit tige gauche ou droite au hasard if (freqTotale == 0) { freqTotale = 2; freqTigeDroite = freqTigeGauche = 1; } int n = rand.Next(freqTotale); // Tige gauche if (n < freqTigeGauche) { return(new Noeud(max * mult, gauche: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max - 1, min))); } n -= freqTigeGauche; // Tige droite if (n < freqTigeDroite) { return(new Noeud(min * mult, droite: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max, min + 1))); } // Embranchement int med = rand.Next(min + 1, max); return(new Noeud(med * mult , gauche: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, med - 1, min) , droite: rand.Arbre(freqEmbranchement, freqTigeGauche, freqTigeDroite, max, med + 1) )); }