Mam dwa sposoby tworzenia listy przedmiotów w losowej kolejności i chciałbym ustalić, czy są one równie uczciwe (obiektywne).
Pierwszą metodą, której używam, jest skonstruowanie całej listy elementów, a następnie wykonanie losowania (powiedzmy losowanie Fisher-Yates). Druga metoda jest raczej metodą iteracyjną, która utrzymuje losowość listy przy każdym wstawieniu. W pseudokodzie funkcja wstawiania to:
insert( list, item )
list.append( item )
swap( list.random_item, list.last_item )
Interesuje mnie, jak można pokazać uczciwość tego konkretnego przetasowania. Zalety tego algorytmu, jeśli jest używany, są wystarczające, aby nawet jeśli byłoby nieco niesprawiedliwe, byłoby w porządku. Aby zdecydować, potrzebuję sposobu na ocenę jego uczciwości.
Moim pierwszym pomysłem jest to, że muszę obliczyć całkowitą permutację możliwą w ten sposób w porównaniu do całkowitej permutacji możliwej dla zestawu ostatecznej długości. Nie jestem jednak pewien, jak obliczyć permutacje wynikające z tego algorytmu. Nie mogę też mieć pewności, że jest to najlepsze lub najłatwiejsze podejście.
źródło
Odpowiedzi:
Najpierw stwórzmy dwa, być może oczywiste, ale ważne założenia:
_.random_item
może wybrać ostatnią pozycję._.random_item
wybiera każdą pozycję z prawdopodobieństwem .Aby udowodnić poprawność algorytmu, potrzebujesz argumentu indukcyjnego podobnego do zastosowanego tutaj :
Odtąd dowód jest błędny. Poniżej znajduje się poprawny dowód; Zostawiam to tutaj, ponieważ zarówno błąd, jak i następujące kroki (które są rozsądne) mogą być pouczające.
Przydatne jest wyprowadzenie lokalnej (tj. Elementowej) właściwości, która musi zostać zachowana, ponieważ kłótnie o całą permutację są bolesne. Zauważ, że permutacja jest wybierana równomiernie, jeśli każdy element ma równe prawdopodobieństwo bycia w każdej pozycji, tj
gdzie i zakładamy dla uproszczenia, że wstawiamy { 1 , … , n } do listy.n = | L | { 1 , … , n }
Zobaczmy teraz, co robi Twoja technika przy wstawianiu elementu . Musimy rozważyć trzy przypadki (po zamianie):n + 1
Dla każdego przypadku obliczamy prawdopodobieństwo, że element będzie w pozycji i ; wszystkie muszą być 1jot ja (co jest wystarczające z powodu(1)). Niechpn=11n + 1 ( 1 ) oznacza prawdopodobieństwo, że jeden z pierwszychnelementów znajdzie się w dowolnej pozycji na starej liście (hipoteza indukcyjna), aps=1pn= 1n n prawdopodobieństwo, że dowolna pozycja zostanie wybrana przez(założenia 1, 2). Zwróć uwagę, że coice listy zelementamini wybranie pozycji zamiany sązdarzeniami niezależnymi, więc prawdopodobieństwo czynników wspólnych zdarzeń, np.ps= 1n + 1 n
random_item
dla . Teraz do obliczeń.i , j ∈ { 1 , … , n }
Bierzemy pod uwagę tylko stare elementów. Taki element J znajduje się w pozycji i tylko wtedy, gdy to było przed ostatnim wkładania oraz i nie wchodzi w położeniu wymiany, to jestn jot ja ja
.Pr( Lja= j ) = pn( 1 - ps) = 1n. Nn + 1= 1n + 1
Uważamy tutaj, że jeden ze starych elementów jest zamieniany na ostatnią pozycję. Element mógł znajdować się na dowolnej ze starych pozycji, więc sumujemy wszystkie prawdopodobieństwa, że j było na pozycji i, a i wybrano jako pozycję wymiany, to znaczyjot jot ja ja
.Pr( Ln + 1= j ) = ∑i = 1npnps= ∑i = 1n1n⋅ 1n + 1= 1n + 1
Nowy element kończy się w pozycji wtedy i tylko wtedy, gdy i jest wybrane jako pozycja wymiany, to znaczyja ja
.Pr( Lja= j ) = ps= 1n + 1
Wszystko okazało się dobrze, twoja strategia wstawiania rzeczywiście zachowuje jednolitość. Dzięki sile indukcji dowodzi to, że algorytm tworzy jednolicie rozmieszczone permutacje.
Słowo ostrzeżenia: dowód ten psuje się, jeśli wstawione elementy nie są połączone parami inaczej. rozróżnialne, ponieważ wtedy pierwsze równanie nie jest już ważne. Ale twój algorytm jest nadal aktualny; każda permutacja z duplikatami jest generowana przez tę samą liczbę losowych wykonań. Możesz to udowodnić, zaznaczając duplikaty (tzn. Czyniąc je rozróżnialnymi), wykonaj powyższy dowód i usuń oznaczenia (praktycznie); ostatni krok zwija zestawy równych rozmiarów permutacji do tego samego.
Jak słusznie zauważył Steven w komentarzach, powyższy dowód jest zasadniczo wadliwy, ponieważ nie ma zastosowania; możesz konstruować rozkłady na zbiorze permutacji, które spełniają prawą, ale nie lewą stronę¹.( 1 )
random_item
random_item
które musieliśmy pokazać. Dzięki sile indukcji dowodzi to, że algorytm tworzy jednolicie rozmieszczone permutacje.
źródło