Ist Collections.shuffle () wirklich zufällig? Praktische Beispiele scheinen diese Aussage zu leugnen

7

Ich habe 1000 einzigartige Objekte in einem java.util.List , jedes bezieht sich auf ein Bild, jedes Bild in der 1000-Liste ist einzigartig und jetzt möchte ich sie mischen, so dass ich die ersten 20 Objekte verwenden und präsentieren kann sie an den Website-Benutzer. Der Benutzer kann dann auf eine Schaltfläche klicken, die "Shuffle" sagt, und ich die 1000 Bilder wieder von Grund auf abrufen und erneut shuffle() aufrufen. Es scheint jedoch, dass ich von 1000 Bildobjekten sehr oft dasselbe Bild zwischen den 20 Bildauswahlen wieder und wieder sehe.

Etwas scheint falsch zu sein, bessere Vorschläge, Ratschläge?

Mein Code ist sehr einfach:

%Vor%

Ich weiß, dass Collections.shuffle() gut verteilt ist: siehe zum Beispiel Ссылка

Ich habe jedoch nur das Gefühl, dass die Wahrscheinlichkeit, in einem Satz von 20 Bildern von 1000 immer wieder dasselbe Bild zu sehen, viel geringer sein sollte ...

Eingaben sehr geschätzt.

    
basZero 14.03.2012, 12:06
quelle

6 Antworten

13

Wenn Sie 20 Bilder von 1000 anzeigen, ist die Wahrscheinlichkeit, eine dieser 20 Wiederholungen in der nächsten Iteration zu sehen, ungefähr 0,34, also sollten Sie nicht überrascht sein, dass sich Bilder wiederholen.

Die Wahrscheinlichkeit, ein bestimmtes Bild zu sehen, ist immer noch eins zu tausend, aber wenn Sie nach zwanzig Bildern suchen, sind die Chancen viel höher.

Wir können die Wahrscheinlichkeit berechnen, dass sich keines der vorherigen 20 Bilder wie folgt wiederholt:

%Vor%

Und so ist die Wahrscheinlichkeit, eine Wiederholung zu sehen, minus eins oder ungefähr 0,34.

Und die Wahrscheinlichkeit, dass ein Bild in einer der nächsten beiden Iterationen wiederholt wird, lautet:

%Vor%

Mit anderen Worten, es ist wahrscheinlicher, dass Sie in den zwei folgenden Zyklen ein wiederholtes Bild sehen. (Und das schließt Bilder nicht ein, die vom zweiten Zyklus im dritten wiederholt werden, die es nur wahrscheinlicher machen werden.)

Was es wert ist, hier ist ein Java-Code, um die obige Berechnung durchzuführen:

%Vor%     
Dave Webb 14.03.2012, 12:19
quelle
28

Seine menschliche Natur, Muster zu sehen, die nicht da sind. Viele Menschen sehen Muster in den Planeten und Sternen, die ihr Leben lenken.

In den ersten 1000 Stellen von PI gibt es sechs Neunen hintereinander. Bedeutet das, dass die Ziffern von PI nicht zufällig sind? Nein. Das Muster tritt nicht mehr auf als erwartet.

Nachdem das gesagt wurde, ist Random nicht völlig zufällig und wird nach 2 ^ 48 Aufrufen wiederholt. (Es verwendet einen 48-Bit-Seed) Dies bedeutet, dass es nicht möglich ist, alle möglichen long oder double damit zu erzeugen. Wenn Sie mehr Zufälligkeit wünschen, können Sie stattdessen SecureRandom mit Shuffle verwenden.

Es klingt wie, was Sie wollen, ist so etwas

%Vor%

Damit stellen Sie sicher, dass in den letzten 500 Aufrufen nicht das gleiche Bild angezeigt wird.

    
Peter Lawrey 14.03.2012 12:39
quelle
5

Ihre Intuition ist korrekt für ein bestimmtes Bild [Sie werden wahrscheinlich kein spezifisches Bild immer wieder sehen], aber nicht für ein allgemeines Bild [Sie werden wahrscheinlich einige sehen Bild wiederholen]. Dies ist einer dieser Orte in der Wahrscheinlichkeit, dass unsere automatische Intuition falsch ist ...

Das erinnert mich das Geburtstagsparadox , was der Intuition widerspricht und sagt - für eine Gruppe von 23 Leuten, die Wahrscheinlichkeit von 2 von ihnen, die den gleichen Geburtstag haben, ist 0.5, viel mehr als die Intuition erwartet!

    
amit 14.03.2012 12:10
quelle
1

Ich habe eine 52 Kartenmischung vier verschiedene Male gemischt und jedes Mal markiert, wenn jede Iteration genau die gleiche Karte im exakt gleichen Slot wiederholt hat, was mir ungefähr 14 von 208 Karten gegeben hat, was ungefähr 93,3% zufällig war.

    
Nicholas 24.10.2013 15:38
quelle
0

Nach Ihrer Frage habe ich folgendes Programm geschrieben. Ich erstellte eine Liste von sequentiellen Ganzzahlen und mischte sie 10, 100, 1000 und 10000 mal. Nach jeder Reihe von Shuffles habe ich den Wert des Elements an der 5. Position des Arrays überprüft und ein Array von Zählern erstellt: Wie oft wird jede Zahl an der 5. Position angezeigt.

Hier ist das Programm:

%Vor%

Und hier sind die Ergebnisse:

10: [0, 1, 1, 1, 2, 0, 0, 3, 2, 0] 100: [11, 9, 9, 7, 10, 12, 13, 13, 8, 8] 1000: [100, 101, 107, 101, 95, 96, 109, 83, 93, 115] 10000: [1015, 942, 990, 1003, 1015, 1037, 977, 1060, 950, 1011]

Wie Sie sehen können, hängt die "Zufälligkeit" von der Anzahl der Shuffle ab. Wenn Sie das Array 10 mal mischen, ist der minimale Zähler 0 und der maximale 3. Der Unterschied zwischen diesen Werten für 100 Shuffle (in Cent) ist viel kleiner. Die Zahlen sind für 10000 Shuffle fast gleich.

Ich denke, dass dieser Test Ihren Anwendungsfall modelliert: Sie zeigen Bilder in einer bestimmten Position der gemischten Sammlung.

Siehe Beitrag von @amit, der die Bedeutung von shuffle beschreibt.

Also ist die Lösung für Sie, Ihr Array 10-mal zu mischen.

EDIT: @Dave Webb gab eine perfekte Erklärung für den Fall.

Der zweite Gedanke ist der folgende: Sie müssen shuffle Sie nicht die Liste der 1000 Elemente, um 20 erste Elemente davon zu übernehmen. Es ist genug, um 20 zufällige Elemente zu nehmen. Sie erhalten den gleichen Effekt, aber viel effektivere Lösung:

%Vor%     
AlexR 14.03.2012 12:26
quelle
-2

Wenn Sie bei diesem Code immer wieder dasselbe Bild sehen, bedeutet dies, dass dasselbe Bild mehrmals in der Liste vorhanden ist. Wo immer Sie Ihre 1000 Bilder bekommen, gibt es Duplikate.

    
Graham Borland 14.03.2012 12:09
quelle