Como você disse, não é possível garantir que todas as permutações sejam igualmente prováveis e que as cores sejam distribuídas igualmente, porque uma das permutações possui todos os vermelhos seguidos.
Um método muito elegante, mas certamente não óbvio, para garantir a distribuição uniforme das cores é alavancar uma sequência de baixa discrepância.
Suponha que você tenha bolas, numeradas de a e um valor de semente, .N=4001Ns
Verifique se todas as bolas da mesma cor são numeradas consecutivamente. Ou seja, no seu caso, deixe as primeiras 100 bolas serem vermelhas, as próximas 40 serem amarelas, as próximas 50 verdes, etc.
Em seguida, aloque a bola pelo valor , de modo que:
em quekthxk
xk=(s+kϕ)(mod1),
- ϕ=1+5√2=1.61803399... , a proporção áurea
- o operador que recebe a parte fracionária do argumento(mod1)
- s é qualquer valor 'semente' constante que você deseja.
Ou seja, cada uma das bolas receberá um valor de que sempre estará entre 0 e 1.Nxk
Agora, basta pedir as bolas, em ordem crescente, de acordo com o valor .xk
Por exemplo, usando o valor inicial de , as bolas serão ordenadas da seguinte maneira:
s=0
{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}
(onde "
B"= Azul e" "= preto).
K
Finalmente, se você deseja coletar uma amostra diferente, basta selecionar um valor de semente diferente, .s
O código Python para essa alocação do é o seguinte: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)