De nombreux fils cherchent une solution permettant d'extraire au hasard des éléments d'une liste en évitant les doublons. Pour les matheux, il s'agit de former une partie (ou combinaison) aléatoire d'un ensemble.
La plupart des solutions proposées se font dans Calc, avec des tas de cases intermédiaires ... bref, pas pour moi
Le dernier fil auquel j'ai participé m'a conduit à écrire une macro plus générale que celle proposée par Bidouille dans ce fil; la voici:
Code : Tout sélectionner
'Renvoie un tableau aléatoire sans répétitions de <n> nombres entiers de 1 à <max>
'Le tableau commence à l'indice 1 et bien sûr n% ne peut être supérieur à max%
Function Combinaison(max%, n%)
Dim res(1 To n)
Dim i%,j%,v%
For i=1 To n
v=1+Int(Rnd*max)
If v>max Then 'Rnd est boguée et pourrait donner 1
i=i-1 'donc on recommence: première boucle
Else 'on vérifie que la valeur n'existe pas déjà
For j=1 To i-1
If v=res(j) Then Exit For
Next j
If j<i Then 'il y a répétition donc on recommence
i=i-1 'deuxième boucle
Else 'tout va bien
res(i)=v
End If
End If
Next i
Combinaison=res
End Function
Cette macro peut être utilisée directement, par exemple pour former votre prochain Loto gagnant, ou en liaison avec un tableau; dans ce dernier cas, remarquez que les tableaux commencent en général à l'indice 0, alors que les numéros retournés par la fonction sont supérieurs ou égaux à 1.
Par exemple, si le tableau associé contient les noms des cartes à jouer, on pourra simuler une distribution de bridge, ou de tout autre jeu; s'il contient les noms des participants d'une loterie, on pourra obtenir la liste des gagnants.
En prime, un exemple d'utilisation, je vous gâte :
Ajout : 30/10/13 Nouvelle version, suite à un problème sur AOO, signalé par rosaguy ; de plus, la donne de bridge s'affichait incorrectement |
Quant à celle qui évite la bogue, on peut aussi la remplacer par une diminution infinitésimale de la valeur renvoyée par Rnd; dans ce cas, la probabilité d'apparition du dernier nombre est en toute rigueur légèrement augmentée, mais cela ne serait sensible que pour de très grandes valeurs de max%.
Ajout : À strictement parler, le résultat de Combinaison est plutôt un "arrangement", c'est-à-dire que les nombres sont renvoyés dans un certain ordre, par exemple, on pourra obtenir {3,1,4} , puis {4,3,1}. Pour un joueur de tiercé, ces deux résultats sont différents (rapports dans l'ordre et sans ordre); ils ne le sont pas s'ils représentent le tirage des trois premiers numéros du Loto (combinaison au sens propre). |
Ajout : 24/09/2013 Une version bien plus rapide m'a été aimablement communiquée par Bernard Marcelly (bm92), avec les mêmes conventions d'appel : Code : Tout sélectionner
|