Я не робив аналіз, щоб підтвердити, наскільки це було б рівномірним (чи ні), і це могло б бути відрегульовано як справжнє перетасування, але ви могли просто вибрати, починаючи з масиву ith -го індексу = 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.