Nie zrobiłem analizę, aby potwierdzić jak jednolita (lub nie) to będzie, a to może być dostosowane do być prawdziwym shuffle, ale można po prostu wybrać, począwszy od tablicy o i
indeksie = th i + 1
, ten (k + RandNum50() + RandNum50() - 1) mod (100 - k)
indeks, z usunięcie, dla k
= 0..99?
To „popycha” szczyt RandNum50() + RandNum50()
rozkładu równomiernie do przodu.
Jestem całkiem pewien, że to nie do końca tak, jak to stwierdziłem, ponieważ indeksu 0 (1) nie można uzyskać od pierwszego wyboru i nie mogę szybko zobaczyć alternatywnej korekty 1..50 + 1..50, która daje 0 ..99.
Aktualizacja
Aby rozwiązać problem, który zauważyłem, skutecznie użyłem, RandNum100
jak wspomniano w komentarzach do pytania, aby losowo zainicjować pierwsze k
przesunięcie.
Daje to rozkład ze znaczną falą z przodu.
Zamiast awansować o 1, użyłem innego, RandNum50
aby zwiększyć to pierwsze k
. Daje to wynik, który jest dla mnie wystarczająco losowy, ale nadal nie jest „prawdziwie” losowy, co można łatwo zobaczyć, jeśli zmienisz K na 2.
Testowanie kodu VB.NET, w którym spełniałem kryteria dla dowolnego parzystego K. Uwaga: w rzeczywistości jest to O (K), 6K + 2.