Я не робив аналіз, щоб підтвердити, наскільки це було б рівномірним (чи ні), і це могло б бути відрегульовано як справжнє перетасування, але ви могли просто вибрати, починаючи з масиву i
th -го індексу = i + 1
, (k + RandNum50() + RandNum50() - 1) mod (100 - k)
індексу, з видалення, для k
= 0..99?
Це "висуває" пік RandNum50() + RandNum50()
розподілу вперед рівномірно.
Я впевнений, що це не зовсім правильно, тому що я це заявив, тому що індекс 0 (1) неможливо отримати з першого вибору, і я не можу швидко побачити альтернативне коригування 1..50 + 1..50, яке створює 0 ..99.
Оновлення
Щоб виправити проблему, яку я зазначив, я ефективно використовував, RandNum100
як згадується в коментарях до запитання, для випадкової ініціалізації першого k
зміщення.
Це виробляє розподіл зі значною хвилею на фронті.
Замість того, щоб просуватися на 1, я використовував інший RandNum50
для збільшення цього першого k
. Це дає результат, який є досить випадковим для мене, але він все ще не є "справді" випадковим, як це легко видно, якщо змінити K на 2.
Тестування коду VB.NET, де я працював за будь-яким рівним K. Зауважте, що це фактично O (K), 6K + 2.