J'ai deux façons de produire une liste d'articles dans un ordre aléatoire et je voudrais déterminer s'ils sont également équitables (sans biais).
La première méthode que j'utilise est de construire la liste complète des éléments puis de faire un shuffle dessus (disons un shuffle de Fisher-Yates). La deuxième méthode est plus une méthode itérative qui maintient la liste mélangée à chaque insertion. En pseudo-code, la fonction d'insertion est:
insert( list, item )
list.append( item )
swap( list.random_item, list.last_item )
Je m'intéresse à la façon de montrer l'équité de ce brassage particulier. Les avantages de cet algorithme, où il est utilisé, sont suffisants pour que même s'il est légèrement injuste, ce serait correct. Pour décider, j'ai besoin d'un moyen d'évaluer son équité.
Ma première idée est que je dois calculer les permutations totales possibles de cette façon par rapport aux permutations totales possibles pour un ensemble de la longueur finale. Je suis cependant un peu perdu sur la façon de calculer les permutations résultant de cet algorithme. Je ne peux pas non plus être certain que c'est l'approche la meilleure ou la plus simple.
la source
Réponses:
D'abord, faisons deux hypothèses peut-être évidentes mais importantes:
_.random_item
peut choisir la dernière position._.random_item
choisit chaque position avec probabilité .Afin de prouver l'exactitude de votre algorithme, vous avez besoin d'un argument inductif similaire à celui utilisé ici :
A partir de là, la preuve est fausse. Veuillez voir ci-dessous pour une preuve correcte; Je laisse cela ici parce que l'erreur et les étapes suivantes (qui sont saines) peuvent être éducatives.
Il est utile de dériver une propriété locale (c'est-à-dire au niveau des éléments) qui doit tenir, car discuter de la permutation entière est douloureux. Observez qu'une permutation est uniformément choisie si chaque élément a une probabilité égale d'être à chaque position, c'est-à-dire
où et nous supposons par souci de simplicité de notation que nous insérons { 1 , … , n } dans la liste.n = | L | { 1 , … , n }
Voyons maintenant ce que fait votre technique lors de l'insertion du er élément. Nous devons considérer trois cas (après l'échange):n + 1
Pour chaque cas, nous calculons la probabilité que l'élément soit en position i ; tous doivent se révéler être 1j i (ce qui est suffisant en raison de(1)). Soitpn=11n+1 (1) la probabilité qu'un desnpremierséléments se trouve à n'importe quelle position dans l'ancienne liste (hypothèse d'induction), etps=1pn=1n n la probabilité que n'importe quelle position soit choisie par(hypothèses 1, 2). Notez que le choix de la liste avecnéléments et le choix de la position de swap sontdes événements indépendants, donc les probabilités d'événements conjoints facteur, par exempleps=1n + 1 n
random_item
pour . Maintenant, pour les calculs.i , j ∈ { 1 , … , n }
Nous ne considérons que les anciens éléments . Un tel élément j est en position i si et seulement s'il était là avant la dernière insertion et i n'est pas sélectionné comme position de swap, c'est-à-diren j i i
.Pr(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1
Ici, nous considérons que l'un des anciens éléments est remplacé par la dernière position. L'élément aurait pu être à n'importe laquelle des anciennes positions, donc nous additionnons toutes les probabilités que j était à la position i et i est choisi comme position de swap, c'est-à-direj j i i
.Pr( Ln + 1= j ) = ∑i = 1npnps= ∑i = 1n1n⋅ 1n + 1= 1n + 1
Le nouvel élément se retrouve à la position si et seulement si i est choisi comme position de swap, c'est-à-direje je
.Pr( Lje= j ) = ps= 1n + 1
Tout s'est bien passé, votre stratégie d'insertion préserve en effet l'uniformité. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.
Un mot d'avertissement: cette preuve tombe en panne si les éléments insérés ne sont pas différents par paire resp. se distingue, car alors la toute première équation n'est plus valable. Mais votre algorithme est toujours valide; chaque permutation avec doublons est générée par le même nombre d'exécutions aléatoires. Vous pouvez le prouver en marquant les doublons (c'est-à-dire en les rendant reconnaissables), effectuer la preuve ci-dessus et supprimer les marquages (virtuellement); la dernière étape réduit les mêmes ensembles de permutations de taille égale.
random_item
random_item
que nous devions montrer. Par la puissance de l'induction, cela prouve que votre algorithme crée des permutations uniformément réparties.
la source