Ich habe die Analyse nicht durchgeführt, um zu bestätigen, wie einheitlich (oder nicht) dies sein würde, und es könnte angepasst werden, um ein echtes Shuffle zu sein, aber könnten Sie einfach aus einem Startarray des i
th-Index = i + 1
den (k + RandNum50() + RandNum50() - 1) mod (100 - k)
Index mit auswählen Entfernung, für k
= 0..99?
Dies "drückt" den Peak in der RandNum50() + RandNum50()
Verteilung gleichmäßig nach vorne.
Ich bin mir ziemlich sicher, dass dies nicht ganz richtig ist, wie ich es angegeben habe, da der 0-Index (1) nicht von der ersten Wahl erhältlich ist und ich nicht schnell eine alternative 1..50 + 1..50-Anpassung sehen kann, die 0 ergibt ..99.
Aktualisieren
Um das von mir festgestellte Problem zu beheben, habe ich, RandNum100
wie in den Fragenkommentaren erwähnt, den ersten k
Versatz zufällig initialisiert .
Dies erzeugt eine Verteilung mit einer signifikanten Welle an der Vorderseite.
Anstatt um 1 voranzukommen, habe ich einen anderen verwendet, RandNum50
um diesen zuerst zu erhöhen k
. Dies führt zu einem Ergebnis, das für mich zufällig genug ist, aber immer noch nicht "wirklich" zufällig ist, wie leicht zu erkennen ist, wenn Sie K in 2 ändern.
Testen von VB.NET-Code, bei dem ich sogar für K. gesorgt habe. Beachten Sie, dass es sich um O (K), 6K + 2 handelt.