Creo que tu sencillo algoritmo barajará las cartas correctamente ya que el número de barajadas tiende al infinito.
Supongamos que tienes tres cartas: {A,B,C}. Suponga que sus cartas comienzan en el siguiente orden: A,B,C. Entonces, después de una barajada tienes las siguientes combinaciones:
{A,B,C}, {A,B,C}, {A,B,C} #You get this if choose the same RN twice.
{A,C,B}, {A,C,B}
{C,B,A}, {C,B,A}
{B,A,C}, {B,A,C}
Por lo tanto, la probabilidad de que la carta A esté en la posición {1,2,3} es {5/9, 2/9, 2/9}.
Si barajamos las cartas por segunda vez, entonces:
Pr(A in position 1 after 2 shuffles) = 5/9*Pr(A in position 1 after 1 shuffle)
+ 2/9*Pr(A in position 2 after 1 shuffle)
+ 2/9*Pr(A in position 3 after 1 shuffle)
Esto da 0,407.
Utilizando la misma idea, podemos formar una relación de recurrencia, es decir
Pr(A in position 1 after n shuffles) = 5/9*Pr(A in position 1 after (n-1) shuffles)
+ 2/9*Pr(A in position 2 after (n-1) shuffles)
+ 2/9*Pr(A in position 3 after (n-1) shuffles).
Codificando esto en R (ver código abajo), da la probabilidad de que la carta A esté en la posición {1,2,3} como {0,33334, 0,33333, 0,33333} después de diez barajadas.
Código R
## m is the probability matrix of card position
## Row is position
## Col is card A, B, C
m = matrix(0, nrow=3, ncol=3)
m[1,1] = 1; m[2,2] = 1; m[3,3] = 1
## Transition matrix
m_trans = matrix(2/9, nrow=3, ncol=3)
m_trans[1,1] = 5/9; m_trans[2,2] = 5/9; m_trans[3,3] = 5/9
for(i in 1:10){
old_m = m
m[1,1] = sum(m_trans[,1]*old_m[,1])
m[2,1] = sum(m_trans[,2]*old_m[,1])
m[3,1] = sum(m_trans[,3]*old_m[,1])
m[1,2] = sum(m_trans[,1]*old_m[,2])
m[2,2] = sum(m_trans[,2]*old_m[,2])
m[3,2] = sum(m_trans[,3]*old_m[,2])
m[1,3] = sum(m_trans[,1]*old_m[,3])
m[2,3] = sum(m_trans[,2]*old_m[,3])
m[3,3] = sum(m_trans[,3]*old_m[,3])
}
m
4 votos
No puedo entender por qué la gente piensa que este intercambio es 'más simple' o 'más ingenuo' que FY... Cuando resolví este problema por primera vez, simplemente implementé FY (sin saber que tiene un nombre), sólo porque me pareció la forma más simple de hacerlo.
1 votos
@mbq: personalmente, los encuentro igual de fáciles, aunque coincido en que FY me parece más "natural".
3 votos
Cuando investigué los algoritmos de barrido después de escribir los míos propios (una práctica que he abandonado desde entonces), me quedé en plan "joder, ya se ha hecho, y tiene un nombre !!"
2 votos
El blog de DataGenetics tiene un excelente artículo ilustrado sobre lo que falla en este algoritmo de barrido .