Programmation : tirage au sort sans redondance

Par Jean-François GAZET le 12 mai 2014

Au cours d’un développement, on peut être amené à tirer au sort des données.
Voici une fonction Java pour tirer au sort un nombre compris entre min et max :

int pif(int min,int max) {
   Random rand=new Random();
   return rand.nextInt((max - min) + 1) + min;
   }

Si vous appelez cette fonction avec par exemple min=5 et max=10 comme ceci :

int a = pif(5,10);

Vous obtiendrez dans la variable “a” un nombre au hasard compris entre 5 et 10 inclus.

Maintenant si on veut aller plus loin…
Par exemple, vous avez 10 boules de loto. Vous voulez effectuer un tirage aléatoire de 3 boules. Si vous appelez trois fois de suite la fonction précédente, elle pourra vous sortir plusieurs fois le même numéro ! Alors on fait comment dans ce cas ?

Pour moi la meilleure solution consiste à simuler la réalité :

  1. dresser l’inventaire des objets
  2. en tirer un au hasard et le retirer de la liste
  3. on continue le tirage autant de fois que l’on veut parmi les éléments restants.

Je reprends les points énumérés ci-dessus en version informatique :

  1. On utilise une variable de type ‘‘tableau’’ dans laquelle on va placer nos 10 boules de loterie :
    boule[0]=1, boule[1]=2, …, boule[9]=10.
    On a donc un tableau de 10 éléments indexés de 0 à 9, et contenant les valeurs des boules soit 1 à 10.
  2. On tire un nombre au hasard entre le premier et le dernier élément de cette liste. L’indice du premier élément est 0. L’indice du dernier élément est égal au nombre d’élements du tableau moins 1 (ben oui on a commencé à 0). Tous les langages de programmation possèdent une fonction retournant le nombre d’éléments d’un tableau.
  3. On supprime l’élément que l’on vient de tirer, ainsi le tableau aura une taille de 9 éléments. Au prochain tirage on piochera parmi ces 9 éléments, etc…

Vous trouverez sur GitHub un exemple de code source en Java pour tirer des nombres aléatoires sans répétition.


Partagez cet article


A lire également Tous les articles