Der Irrtum des Spielers ist eine kognitive Verzerrung, bei der wir fälschlicherweise davon ausgehen, dass Dinge, die in der Zukunft häufig aufgetreten sind, weniger wahrscheinlich sind und Dinge, die seit einiger Zeit nicht mehr aufgetreten sind, eher bald passieren werden. Ihre Aufgabe ist es, eine bestimmte Version davon zu implementieren.
Herausforderungserklärung
Schreiben Sie eine Funktion, die eine zufällige Ganzzahl zwischen 1 und 6 einschließlich zurückgibt. Der Haken: Wenn die Funktion zum ersten Mal ausgeführt wird, sollte das Ergebnis einheitlich sein (innerhalb von 1%). Jeder nachfolgende Aufruf wird jedoch zugunsten von Werten verschoben, die zuvor weniger oft gewürfelt wurden. Die spezifischen Details sind wie folgt:
- Der Würfel merkt sich die Anzahl der bisher erzeugten Zahlen.
- : Jedes Ergebnis wird mit der folgenden Formel gewichtet
- Wenn zum Beispiel die bisherigen Rollenzahlen , sind die Gewichte , das heißt, Sie sind es 4-mal häufiger eine als eine würfeln .
- Beachten Sie, dass die Formel bedeutet, dass ein Rollergebnis von genauso gewichtet wird wie
Regeln und Annahmen
- Es gelten Standard-E / A-Regeln und verbotene Regelungslücken
- Die Rollen sollten nicht deterministisch sein. (Verwenden Sie also ein PRNG, das aus einer flüchtigen Quelle stammt, wie es normalerweise als eingebautes Produkt erhältlich ist.)
- Ihre zufällige Quelle muss eine Periode von mindestens 65535 haben oder echte Zufälligkeit sein.
- Die Verteilungen müssen bei Gewichten bis zu 255 innerhalb von 1% liegen
- 16-Bit-RNGs sind gut genug, um beide oben genannten Anforderungen zu erfüllen. Die meisten eingebauten RNGs sind ausreichend.
- Sie können die aktuelle Verteilung weitergeben, solange diese Verteilung entweder durch den Aufruf mutiert wird oder die Verteilung nach dem Wurf neben dem Würfelwurf zurückgegeben wird. Die Aktualisierung der Verteilung / Anzahl ist Teil dieser Herausforderung .
- Sie können Gewichte anstelle von Zählungen verwenden. Wenn dabei ein Gewicht auf 0 fällt, sollten alle Gewichte um 1 erhöht werden, um den gleichen Effekt wie beim Speichern von Zählwerten zu erzielen.
- Sie können diese Gewichte als Wiederholungen von Elementen in einem Array verwenden.
Viel Glück. Mögen die Bytes immer zu Ihren Gunsten sein.
Antworten:
R , 59 Bytes
Probieren Sie es online!
Behält die Zählungen bei
T
, die dann transformiert werden, um alsweights
Argument für verwendet zu werdensample
(wodurch sie höchstwahrscheinlich zur Summe normalisiert werden1
).Der
[<<-
Operator wird verwendet, umT
in einer der übergeordneten Umgebungen einen Wert zuzuweisen (in diesem Fall ist dies die einzige übergeordnete Umgebung.GlobalEnv
).quelle
T
? (Abgesehen davon, dass der Code schwieriger zu lesen ist!)T
oderF
intern zu verwenden, und dann war ich zu faul, um sie zu ändern, als mir klar wurde, dass ich eine globale Zuweisung benötigte.pawl
.Python 3 ,
11299 BytesProbieren Sie es online!
Erläuterung
Bearbeiten: 13 Bytes gespeichert. Danke, Attinat !
quelle
c,=
und löschen[0]
). Auch erwähnenswert , dasschoices
ist Python 3.6 oder höher05AB1E , 13 Bytes
Probieren Sie es online!
Nimmt die Liste der Zählungen als Eingabe. Gibt die Rolle und die neuen Zählwerte aus.
Erläuterung:
quelle
JavaScript (ES8), 111 Byte
Probieren Sie es online!
Wie?
Dies ist eine eher naive und höchstwahrscheinlich suboptimale Implementierung, die die beschriebene Simulation durchführt.
quelle
APL (Dyalog Unicode) , 32 Byte SBCS
-4 Bytes unter Verwendung von Replikat anstelle von Intervallindex.
Probieren Sie es online!
Wird als eine Funktion definiert, die die aktuelle Verteilung als Argument verwendet, den resultierenden Würfelwurf druckt und die aktualisierte Verteilung zurückgibt. Der erste Lauf auf TIO beginnt mit 100 Aufrufen
[0,0,0,0,0,0]
, der zweite Lauf ist stark auf 1 mit[0,100,100,100,100,100]
und der letzte Lauf ist stark auf 6 in der gleichen Weise vorgespannt.quelle
Perl 6 , 31 Bytes
Probieren Sie es online!
Akzeptiert die aktuelle Gewichtsverteilung als BagHash, beginnend mit einer, bei der alle Gewichte 1 sind. Die Verteilung wird an Ort und Stelle mutiert.
Die BagHash-
pick
Methode wählt einen Schlüssel nach dem Zufallsprinzip unter Verwendung der zugeordneten Gewichte aus. Das Gewicht dieses Schlüssels wird dann um eins verringert. Wenn dieses Gewicht dadurch zu Null gemacht wird, werden++«.{1..6}
die Gewichte aller Zahlen 1-6 inkrementiert.quelle
Wolfram Language (Mathematica) , 91 Bytes
Probieren Sie es online!
quelle
Javascript (ES6 +), 97 Byte
Erläuterung
Beachten Sie, dass dies irgendwann explodiert, wenn
w
eine Länge von 2 32 -1 überschritten wird. Dies ist die maximale Array-Länge in js. Unter Berücksichtigung einer Länge von 32-Bit-Int-Arrays von 2 32 -1 werden Sie jedoch wahrscheinlich vorher an eine Speichergrenze stoßen 16GiB und einige (die meisten?) Browser lassen Sie nicht mehr als 4GiB verwenden.quelle
Perl 6 , 49 Bytes
Probieren Sie es online!
Nimmt die vorherigen Rollen als Beutel (Multiset). Gibt die neue Rolle und die neue Verteilung zurück.
Erläuterung
quelle
Pyth ,
22 bis20 BytesProbieren Sie es online!
Eingabe ist die vorherige Frequenz als Liste, Ausgabe der nächsten Rolle und der aktualisierten Frequenzen, getrennt durch einen Zeilenumbruch.
quelle
Gelee , 12 Bytes
Probieren Sie es online!
Ein monadischer Link, der ein einzelnes Argument, die aktuelle Zählliste, verwendet und eine Liste der ausgewählten Nummer und der aktualisierten Zählliste zurückgibt.
Jelly , 18 Bytes
Probieren Sie es online!
Als Alternative gibt es hier einen Link, der die gewählte Nummer zurückgibt und die Zählerliste im Register verfolgt.
quelle