Je n'ai pas fait l'analyse pour confirmer à quel point cela serait uniforme (ou non), et cela pourrait être ajusté pour être un vrai mélange, mais pourriez-vous simplement choisir, à partir d'un tableau de départ du i
th index = i + 1
, l' (k + RandNum50() + RandNum50() - 1) mod (100 - k)
index, avec suppression, pour k
= 0..99?
Cela "pousse" RandNum50() + RandNum50()
uniformément le pic de la distribution vers l'avant.
Je suis à peu près sûr que ce n'est pas tout à fait raison, comme je l'ai dit, car l'index 0 (1) ne peut pas être obtenu à partir du premier choix et je ne peux pas voir rapidement un autre ajustement 1..50 + 1..50 qui produit 0 ..99.
Mise à jour
Pour résoudre le problème que j'ai noté, j'ai effectivement utilisé RandNum100
comme mentionné dans les commentaires de la question pour initialiser au hasard le premier k
décalage.
Cela produit une distribution avec une onde importante à l'avant.
Au lieu d'avancer de 1, j'en ai utilisé un autre RandNum50
pour l'incrémenter en premier k
. Cela produit un résultat qui est assez aléatoire pour moi, mais ce n'est toujours pas "vraiment" aléatoire, comme on peut le voir facilement si vous changez K en 2.
Test du code VB.NET où je répondais à tout K. pair. Notez que c'est O (K), 6K + 2 en fait.