No he hecho el análisis para confirmar qué tan uniforme (o no) sería esto, y podría ajustarse para que sea una mezcla aleatoria verdadera, pero ¿podría elegir, desde una matriz inicial del iíndice th = i + 1, el (k + RandNum50() + RandNum50() - 1) mod (100 - k)índice, con eliminación, para k= 0..99?
Esto "empuja" el pico en la RandNum50() + RandNum50()distribución hacia adelante de manera uniforme.
Estoy bastante seguro de que esto no es del todo correcto, ya que lo he dicho porque el índice 0 (1) no se puede obtener de la primera opción y no puedo ver rápidamente un ajuste alternativo 1..50 + 1..50 que produzca 0 ..99.
Actualizar
Para solucionar el problema que noté, utilicé efectivamente RandNum100como se menciona en los comentarios de la pregunta para inicializar aleatoriamente el primer kdesplazamiento.
Esto produce una distribución con una onda significativa en el frente.
En lugar de avanzar por 1, usé otro RandNum50para incrementar eso primero k. Esto produce un resultado que es lo suficientemente aleatorio para mí, pero todavía no es "verdaderamente" aleatorio, como se puede ver fácilmente si cambia K a 2.
Probar el código VB.NET donde atendí a cualquier K. Tenga en cuenta que es O (K), 6K + 2, de hecho.