Esto es algo muy interesante que he encontrado al intentar shuffle $n$ valores en una lista es una manera determinista destinado a buscar "random-ish". La idea es que se puede ordenar un número de valores de $r$ de $0...n-1$ en una lista empezando con un valor del índice $i=0$, a continuación, calcular el índice para el nuevo elemento en el que se inserta utilizando la fórmula de $i_1 = (i_0 + r)\mod n$. Lo que me he encontrado es que en la mayoría de los casos, hay varias colisiones, donde un número se coloca sobre otro , excepto cuando se $n = 2^k, k\in Z$.
Me escribió un programa en Python para hacer esto y mostrar el resultado.
>>> for n in range(5,11):
print('_____')
num_list = ['' for i in range(n)]
i = 0
for r in range(n):
i = (i + r) % n
num_list[i] += str(r) + ','
for x in range(n):
print(str(x)+'|'+num_list[x])
_____
0|0,4,
1|1,3,
2|
3|2,
4|
_____
0|0,3,
1|1,
2|
3|2,5,
4|4,
5|
_____
0|0,6,
1|1,5,
2|
3|2,4,
4|
5|
6|3,
_____
0|0,
1|1,
2|4,
3|2,
4|7,
5|6,
6|3,
7|5,
_____
0|0,8,
1|1,4,7,
2|
3|2,6,
4|
5|
6|3,5,
7|
8|
_____
0|0,4,
1|1,6,
2|
3|2,
4|
5|5,9,
6|3,8,
7|
8|7,
9|
>>>
Como se puede ver, varios números se asignan el mismo valor para todos los casos, excepto donde n es una potencia de 2. ¿Alguien puede explicar esto?