Eu tenho duas maneiras de produzir uma lista de itens em uma ordem aleatória e gostaria de determinar se eles são igualmente justos (imparciais).
O primeiro método que eu uso é construir a lista inteira de elementos e, em seguida, fazer um shuffle (por exemplo, um shuffle de Fisher-Yates). O segundo método é mais um método iterativo que mantém a lista embaralhada a cada inserção. No pseudo-código, a função de inserção é:
insert( list, item )
list.append( item )
swap( list.random_item, list.last_item )
Estou interessado em como alguém mostra a imparcialidade desse embaralhamento em particular. As vantagens desse algoritmo, onde é usado, são suficientes para que, mesmo que um pouco injusto, tudo bem. Para decidir, preciso de uma maneira de avaliar sua justiça.
Minha primeira idéia é que eu preciso calcular o total de permutações possíveis dessa forma versus as totais de permutações possíveis para um conjunto do comprimento final. No entanto, estou um pouco sem saber como calcular as permutações resultantes desse algoritmo. Também não posso ter certeza de que esta é a melhor ou mais fácil abordagem.
fonte
Respostas:
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 .Para provar a correção do seu algoritmo, você precisa de um argumento indutivo semelhante ao usado aqui :
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,
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
Para cada caso, calculamos a probabilidade do elemento estar na posição i ; tudo tem que vir a ser 1j i (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=1n n 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+1 n
random_item
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.
random_item
random_item
o que tivemos que mostrar. Pelo poder da indução, isso prova que seu algoritmo cria permutações uniformemente distribuídas.
fonte