Como dijiste, no es posible asegurar que cada permutación sea igualmente probable y que los colores se distribuyan uniformemente, porque una de las permutaciones tiene todos los rojos en una fila.
Un método muy elegante, pero ciertamente no obvio, para garantizar que los colores se distribuyan uniformemente es aprovechar una secuencia de baja discrepancia.
Suponga que tiene bolas, numeradas del al , y un valor inicial, .N=4001Ns
Asegúrese de que todas las bolas del mismo color estén numeradas consecutivamente. Es decir, en su caso, deje que las primeras 100 bolas sean rojas, las siguientes 40 sean amarillas, las siguientes 50 verdes, etc.
Luego, asigne a la bola el valor, tal que:
dondekthxk
xk=(s+kϕ)(mod1),
- ϕ=1+5√2=1.61803399... , la proporción áurea
- el que toma la parte fraccionaria del argumento(mod1)
- s es cualquier valor 'semilla' constante que desee.
Es decir, a cada una de las bolas se le asignará un valor de que siempre estará entre 0 y 1.Nxk
Ahora simplemente ordene las bolas, en orden ascendente de acuerdo con su valor .xk
Por ejemplo, usando el valor semilla de , las bolas se ordenarán de la siguiente manera:
s=0B K
{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
(donde "
B"= Azul y" "= Negro).
K
Finalmente, si desea tomar una muestra diferente, simplemente seleccione un valor semilla diferente, .s
El código de Python para esta asignación de es el siguiente:xk
n=400
phi = (1+pow(5,0.5))/2
x = np.zeros(n)
s = np.random.uniform(0,1)
for i in range(n):
x = (s + phi*(i+1)) %1
print (s)
print (x)