Primeiro, vamos fazer duas suposições talvez óbvias, mas importantes:
_.random_item
pode escolher a última posição.
_.random_item
escolhe todas as posições com probabilidade .1n + 1
Para provar a correção do seu algoritmo, você precisa de um argumento indutivo semelhante ao usado aqui :
- Para a lista de singleton, há apenas uma possibilidade, portanto ela é escolhida uniformemente.
- Supondo que a lista com elementos tenha sido escolhida uniformemente (de todas as permutações), mostre que aquela com n + 1 elementos obtidos por sua técnica é escolhida uniformemente.nn + 1
A partir daqui, a prova está errada. Veja abaixo uma prova correta; Deixo isso aqui porque o erro e as etapas a seguir (que são válidas) podem ser educacionais.
É útil derivar uma propriedade local (isto é, em termos de elementos) que deve ser mantida, porque argumentar sobre toda a permutação é doloroso. Observe que uma permutação é escolhida uniformemente se cada elemento tiver a mesma probabilidade de estar em cada posição, ou seja,
∀π∈ P e r mnPr( L = π) = 1n !⟺∀i = 1n ∀j = 1nPr( LEu= j ) = 1n( 1 )
onde e assumimos, por uma questão de simplicidade notacional, que inserimos { 1 , … , n } na lista.n = | L |{1,…,n}
Agora, vamos ver o que sua técnica faz ao inserir o elemento. Temos que considerar três casos (após a troca):n+1
- Um dos elementos da lista, não trocado, ou seja, e j ∈ { 1 , … , n }i∈{1,…,n}j∈{1,…,n}
- Um dos elementos da lista foi trocado, ou seja, e j ∈ { 1 , … , n }i=n+1j∈{1,…,n}
- O novo elemento, isto é, e j = n + 1i∈{1,…,n+1}j=n+1
Para cada caso, calculamos a probabilidade do elemento estar na posição i ; tudo tem que vir a ser 1ji (que é suficiente devido a(1)). Sejapn=11n+1(1) ser a probabilidade de um dos primeirosnelementos, sendo em qualquer posição na lista velha (hipótese de indução), eps=1pn=1nn a probabilidade de qualquer posição ser escolhida por(suposições 1, 2). Observe que a escolha da lista comnelementos e a escolha da posição de swap sãoeventos independentes; portanto, as probabilidades de eventos conjuntos são fatores, por exemplo,ps=1n+1random_item
n
Pr(Li=j,i swapped)=Pr(Li=j)⋅Pr(i swapped)=pnps
i,j∈{1,…,n}
njii
Pr(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1
jjii
Pr(Ln+1=j)=∑i=1npnps=∑i=1n1n⋅1n+1=1n+1
ii
Pr(Li=j)=ps=1n+1
Tudo acabou bem, sua estratégia de inserção realmente preserva a uniformidade. Pelo poder da indução, isso prova que seu algoritmo cria permutações uniformemente distribuídas.
Uma palavra de advertência: essa prova se decompõe se os elementos inseridos não diferem entre pares. distinguível, porque a primeira equação não é mais válida. Mas seu algoritmo ainda é válido; toda permutação com duplicatas é gerada pelo mesmo número de execuções aleatórias. Você pode comprovar isso marcando duplicados (ou seja, tornando-os distinguíveis), executando a prova acima e removendo as marcações (virtualmente); o último passo recolhe conjuntos de permutações de tamanhos iguais para o mesmo.
(1)
random_item
L(k){1,…,k}
π′∈Permn+1{1,…,n+1}
π′=(π(1),π(2),…,π(i−1),n+1,π(i+1),…,π(n),π(i))
π∈Permni∈{1,…,n+1}Pr(L(n)=π)=1n!random_item
i1n+1πi
Pr(L(n+1)=π′)=Pr(L(n)=π)⋅Pr(i swapped)=1(n+1)!
o que tivemos que mostrar. Pelo poder da indução, isso prova que seu algoritmo cria permutações uniformemente distribuídas.
- {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140