Grundsätzlich benötigen Sie einen "semi-zufälligen" Ereignisgenerator, der Ereignisse mit den folgenden Eigenschaften generiert:
Die durchschnittliche Häufigkeit, mit der jedes Ereignis eintritt, ist im Voraus festgelegt.
Es ist weniger wahrscheinlich, dass dasselbe Ereignis zweimal hintereinander auftritt als zufällig.
Die Ereignisse sind nicht vollständig vorhersehbar.
Eine Möglichkeit, dies zu tun, besteht darin, zuerst einen nicht zufälligen Ereignisgenerator zu implementieren , der die Ziele 1 und 2 erfüllt, und dann eine gewisse Zufälligkeit hinzuzufügen, um Ziel 3 zu erfüllen.
Für den nicht zufälligen Ereignisgenerator können wir einen einfachen Dithering- Algorithmus verwenden. Insbesondere sei p 1 , p 2 , ..., p n die relative Wahrscheinlichkeit der Ereignisse 1 bis n , und sei s = p 1 + p 2 + ... + p n die Summe der Gewichte. Mit dem folgenden Algorithmus können wir dann eine nicht zufällige, maximal gleich verteilte Folge von Ereignissen erzeugen:
Zunächst sei e 1 = e 2 = ... = e n = 0.
Um ein Ereignis zu erzeugen, inkrementieren Sie jedes e i um p i und geben Sie das Ereignis k aus, für das e k am größten ist (brechen Sie die Bindungen nach Belieben).
Dekrementieren Sie e k um s und wiederholen Sie den Vorgang ab Schritt 2.
Beispielsweise erzeugt dieser Algorithmus bei drei Ereignissen A, B und C mit p A = 5, p B = 4 und p C = 1 so etwas wie die folgende Folge von Ausgaben:
A B A B C A B A B A A B A B C A B A B A A B A B C A B A B A
Beachten Sie, dass diese Folge von 30 Ereignissen genau 15 As, 12 Bs und 3 Cs enthält. Es ist nicht ganz optimal verteilt - es gibt ein paar Vorkommen von zwei As in einer Reihe, die hätte vermieden werden können - aber es kommt näher.
Um dieser Sequenz eine Zufälligkeit hinzuzufügen, haben Sie mehrere (sich nicht unbedingt gegenseitig ausschließende) Optionen:
Sie können Philipps Rat befolgen und ein "Deck" mit N anstehenden Ereignissen für eine entsprechend große Anzahl von N verwalten . Jedes Mal, wenn Sie ein Ereignis erzeugen müssen, wählen Sie ein zufälliges Ereignis aus dem Deck aus und ersetzen es durch das nächste Ereignis, das vom obigen Dithering-Algorithmus ausgegeben wird.
Wendet man dies auf das obige Beispiel mit N = 3 an, so erhält man zB:
A B A B C A B B A B A B C A A A A B B A B A C A B A B A B A
Während N = 10 das eher zufällig aussehende ergibt:
A A B A C A A B B B A A A A A A C B A B A A B A C A C B B B
Beachten Sie, dass die häufigen Ereignisse A und B aufgrund des Mischens viel häufiger auftreten, während die seltenen C-Ereignisse immer noch relativ weit auseinander liegen.
Sie können dem Dithering-Algorithmus Zufälligkeiten hinzufügen. Anstatt in Schritt 2 e i um p i zu inkrementieren, könnten Sie es beispielsweise um p i × random (0, 2) inkrementieren , wobei random ( a , b ) eine gleichmäßig verteilte Zufallszahl zwischen a und b ist ; Dies würde eine Ausgabe wie die folgende ergeben:
A B B C A B A A B A A B A B A A B A A A B C A B A B A C A B
oder Sie könnten e i um p i + zufällig erhöhen (- c , c ), was ergeben würde (für c = 0,1 × s ):
B A A B C A B A B A B A B A C A B A B A B A A B C A B A B A
oder für c = 0,5 × s :
B A B A B A C A B A B A A C B C A A B C B A B B A B A B C A
Beachten Sie, dass das additive Schema für die seltenen Ereignisse C einen viel stärkeren Randomisierungseffekt hat als für die häufigen Ereignisse A und B, verglichen mit dem multiplikativen. Dies könnte oder könnte nicht wünschenswert sein. Natürlich können Sie auch eine Kombination dieser Schemata oder eine andere Anpassung der Inkremente verwenden, sofern dabei die Eigenschaft erhalten bleibt, dass das durchschnittliche Inkrement von e i gleich p i ist .
Alternativ können Sie die Ausgabe des Dithering-Algorithmus stören, indem Sie manchmal das ausgewählte Ereignis k durch ein zufälliges Ereignis ersetzen (das gemäß den Rohgewichten p i ausgewählt wird ). Solange Sie in Schritt 3 dasselbe k wie in Schritt 2 verwenden, gleicht der Dithering-Vorgang zufällige Schwankungen aus.
Hier ein Beispiel für eine Ausgabe mit einer Wahrscheinlichkeit von 10%, dass jedes Ereignis nach dem Zufallsprinzip ausgewählt wird:
B A C A B A B A C B A A B B A B A B A B C B A B A B C A B A
und hier ist ein Beispiel mit einer 50% igen Chance, dass jede Ausgabe zufällig ist:
C B A B A C A B B B A A B A A A A A B B A C C A B B A B B C
Sie können auch erwägen, eine Mischung aus rein zufälligen und geditherten Ereignissen in einen Deck / Mixing-Pool einzuspeisen, wie oben beschrieben, oder den Dithering-Algorithmus durch zufällige Auswahl von k zu randomisieren, wie durch die e i gewichtet (wobei negative Gewichte als Null behandelt werden).
Ps. Hier sind einige völlig zufällige Ereignissequenzen mit den gleichen Durchschnittsraten zum Vergleich:
A C A A C A B B A A A A B B C B A B B A B A B A A A A A A A
B C B A B C B A A B C A B A B C B A B A A A A B B B B B B B
C A A B A A B B C B B B A B A B A A B A A B A B A C A A B A
Tangens: Da in den Kommentaren einige Debatten darüber geführt wurden, ob es für deckbasierte Lösungen erforderlich ist, das Deck vor dem Nachfüllen entleeren zu lassen, habe ich mich für einen grafischen Vergleich mehrerer Strategien zum Befüllen von Decks entschieden:
Darstellung mehrerer Strategien zur Erzeugung von halbzufälligen Münzwürfen (mit einem durchschnittlichen Verhältnis von Kopf zu Zahl von 50:50). Die horizontale Achse ist die Anzahl der Kippbewegungen, die vertikale Achse ist der kumulative Abstand vom erwarteten Verhältnis, gemessen als (Kopf - Zahl) / 2 = Kopf - Kippbewegungen / 2.
Die roten und grünen Linien in der Grafik zeigen zum Vergleich zwei nicht deckbasierte Algorithmen:
- Rote Linie, deterministisches Dithering : Gerade Ergebnisse sind immer Köpfe, ungerade Ergebnisse sind immer Schwänze.
- Grüne Linie, unabhängige Zufallswechsel : Jedes Ergebnis wird unabhängig nach dem Zufallsprinzip ausgewählt, mit einer 50% igen Chance für Kopf und einer 50% igen Chance für Zahl.
Die anderen drei Linien (blau, lila und cyan) zeigen die Ergebnisse von drei deckbasierten Strategien, die jeweils mit einem Deck von 40 Karten implementiert wurden, das anfänglich mit 20 "Kopf" -Karten und 20 "Schwanz" -Karten gefüllt ist:
- Blaue Linie, leer ausfüllen : Die Karten werden nach dem Zufallsprinzip gezogen, bis das Deck leer ist. Anschließend wird das Deck mit 20 "Kopf" -Karten und 20 "Schwanz" -Karten aufgefüllt.
- Lila Linie, füllen, wenn die Hälfte leer ist : Die Karten werden nach dem Zufallsprinzip gezogen, bis noch 20 Karten übrig sind. Dann wird das Deck mit 10 "Kopf" -Karten und 10 "Schwanz" -Karten aufgefüllt.
- Cyan-Linie, kontinuierlich füllen : Die Karten werden nach dem Zufallsprinzip gezogen. Unentschieden mit geraden Zahlen werden sofort durch eine "Kopf" -Karte und Unentschieden mit ungeraden Zahlen durch eine "Schwanz" -Karte ersetzt.
Natürlich ist die obige Handlung nur eine einzelne Realisierung eines zufälligen Prozesses, aber sie ist einigermaßen repräsentativ. Insbesondere können Sie sehen, dass alle deckbasierten Prozesse eine begrenzte Verzerrung aufweisen und ziemlich nahe an der roten (deterministischen) Linie bleiben, während die rein zufällige grüne Linie schließlich abweicht.
(Tatsächlich ist die Abweichung der blauen, violetten und cyanfarbenen Linien von Null streng durch die Deckgröße begrenzt: Die blaue Linie kann niemals mehr als 10 Schritte von Null entfernt sein, die violette Linie kann nur 15 Schritte von Null entfernt sein In der Praxis ist es natürlich äußerst unwahrscheinlich, dass eine der Linien tatsächlich ihre Grenze erreicht, da die Tendenz besteht, dass sie näher an Null zurückkehren, wenn sie zu weit wandern aus.)
Auf einen Blick gibt es keinen offensichtlichen Unterschied zwischen den verschiedenen deckbasierten Strategien (obwohl die blaue Linie im Durchschnitt etwas näher an der roten Linie und die Cyan-Linie etwas weiter entfernt bleibt), aber eine genauere Betrachtung der blauen Linie zeigt ein deutliches deterministisches Muster: Alle 40 Ziehungen (markiert durch die gepunkteten grauen vertikalen Linien) trifft die blaue Linie genau auf die rote Linie bei Null. Die violetten und cyanfarbenen Linien sind nicht so stark eingeschränkt und können an jedem Punkt von Null abweichen.
Bei allen deckbasierten Strategien ist das wichtige Merkmal, das die Variation begrenzt, die Tatsache, dass das Deck deterministisch aufgefüllt wird , während die Karten zufällig aus dem Deck gezogen werden . Wenn die Karten, die zum Nachfüllen des Decks verwendet wurden, selbst zufällig ausgewählt würden, würden alle deckbasierten Strategien nicht mehr von der reinen Zufallsauswahl (grüne Linie) zu unterscheiden sein.