Einführung
Sie erhalten einen zufälligen Ganzzahlgenerator mit der folgenden Implementierung
- Der erste Aufruf gibt immer 1 zurück.
- Der zweite Aufruf gibt eine zufällige Ganzzahl zwischen 1 und 2 zurück.
- Der dritte Aufruf gibt eine zufällige Ganzzahl zwischen 1 und 3 zurück.
- Der n-te Aufruf gibt eine zufällige Ganzzahl zwischen 1 und n einschließlich zurück.
Schreiben Sie basierend auf der obigen Funktion einen Zufallswürfelgenerator, der vollkommen zufällig ist und mit gleicher Wahrscheinlichkeit einen Wert zwischen 1 und 6 (einschließlich) zurückgibt.
Regeln
- Ihr Programm / Ihre Funktion sollte zu einer zufälligen Ganzzahl zwischen 1 und 6 führen, einschließlich in einer verwendbaren Form, dh zur Standardausgabe oder als Funktionsrückgabewert.
- Der obige Generator für aufsteigende Zufallszahlen kann als "freie" Funktion in Ihrem Programm definiert werden (dh zählt nicht für Ihre Zeichenanzahl) oder als separates Skript / Programm, das nach Bedarf ausgeführt wird, vorausgesetzt, der Status (
n
) ist dauerhaft zwischen Anrufen. - Angenommen, in einem einzigen Anwendungsfall Ihres Programms werden niemals mehr als 1000 Würfelwürfe angefordert, und der anfängliche Zufallszahlengenerator kann
1
auf das Ende von 1000 Würfeln zurückgesetzt werden, um ein Überlaufen von zu vermeidenn
. - Ihr Programm verwendet möglicherweise keine andere Zufallszahlenquelle als den oben definierten aufsteigenden Zufallsgenerator. Sie können natürlich mehrere Zufallszahlen vom Zufallszahlengenerator für jede einzelne Würfelwurfausgabe anfordern.
- Dies ist Code-Golf, daher ist der Gewinner die kürzeste Antwort oder die meisten Stimmen im Falle eines Unentschieden. Wenn Sie 1000 Würfelwürfe mit weniger als 1000 generierten Zufallszahlen generieren können, geben Sie sich einen 10-Punkte-Effizienzbonus .
Beispiel
./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4
# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1
iterate(6):b=asc-rand(); print b
illegal oder funktioniert es nicht? Ich könnte die dritte Regel falsch verstehen.Antworten:
J - 13 char
Dies macht die gleichen Annahmen wie bei Golfscript: Die Anzahl der Würfel ist in Standard und wir listen die Würfelwürfe auf, die herauskommen sollen.
Erklärt durch Explosion:
Wenn das irgendwie unbefriedigend ist, gibt es hier ein längeres Programm mit 21 Zeichen, mit
f''
dem Zufallszahlen generiert werden können, die einen Status und alles enthalten.quelle
r:{*1_draw x}
, Standardversion (10 Zeichen)r'1+!. 0:`
, Funktionsversion (14 Zeichen),c:0;f:{r@c+:1}
aufgerufen vonf[]
.Python, 31 Zeichen
Definieren Sie den Generator ähnlich wie beim Scleaver wie folgt:
Dann eine Funktion zum Zurückgeben von Würfeln:
Rufen Sie
D()
jederzeit an, wenn Sie einen gleichmäßig zufälligen Würfelwurf benötigen.quelle
Scala 23
Die Methode r kann (ca.) folgendermaßen implementiert werden:
ein grober Test:
Jeder 6. Aufruf sollte eine gleichmäßige Verteilung über die 6 Werte ergeben, also werfe ich 5 weg.
quelle
GolfScript (15 Zeichen)
Dies setzt voraus, dass die Anzahl der erforderlichen Rollen auf stdin angegeben ist, und listet so viele Ergebnisse auf, die stdout liefert.
Online-Demo
Ich könnte zwar den 10-Punkte-Bonus erhalten, wenn ich weniger als 1000 Würfe verwende, um 1000 Zahlen zu generieren, aber es würde mich weit mehr als 10 Zeichen kosten. Der triviale Ansatz, eine geeignete Entropie zu extrahieren, wenn N ein Vielfaches einer Potenz von 2 oder 3 ist, ist nicht ausreichend, da die Anzahl der verfügbaren Ergebnisse mod 3 nur 333 + 111 + 37 + 12 + 4 + 1 = 498 beträgt Nehmen Sie einen Sample-and-Reject-Ansatz. Mit diesem Ansatz können Sie erwartete 2242 Rollen von 1000 Anrufen bis erhalten
r
, aber die Buchhaltung verursacht zusätzlichen Aufwand undbase
ist ein sehr langer Funktionsname.quelle
base
ist ein sehr langer Funktionsname" Sie verwenden anscheinend Mathematica nicht . Wir bekommen solche Wunder wieNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
, undSemialgebraicComponentInstances
. :-)Python
6563Die Funktion
R()
ist der aufsteigende Randomizer.Verwendungszweck:
quelle
for
Schleife loswerden und nurR
einmal vor deinerwhile
Schleife aufrufen ?R()
, dass ein Float zurückgegeben wurde und Sie die niedrigstwertige Ziffer ergriffen haben . Nachdem klargestellt wurde, dassR()
eine Ganzzahl zurückgegeben wird, ist dies sinnvoll.Python, 56
r ist definiert als:
der Würfelgenerator d:
Verwendung, zB für 100 Rollen:
quelle
import math
wenn Sie ersetzenmath.ceil(...)
mitint(...)+1
Mathematica 51
Der Zufallszahlengenerator
r
wird zurückgesetzt, indem die globale Variablen
auf 1 gesetzt wird.Code
Nicht im Rennen um den kürzesten Code ...
Verwendungszweck
60000 Würfelwürfe erforderten 60031 Aufrufe an
h
.Tally
zeigt die Aufteilung nach den Nummern 1-6.quelle
Perl, 22 oder 45
Implementierung des aufsteigenden Zufallszahlengenerators:
Erstellen:
Austesten:
quelle
JavaScript (Node.js) , 35 Byte
Probieren Sie es online aus!
quelle
x86-Opcode, 15 Bytes
quelle
GolfScript , 8 Bytes
Probieren Sie es online aus!
Es schaltet den Generator einmal ein und entfernt dann das Ergebnis. Dann würfelt es f2 und multipliziert es mit 3 (3 oder 6), subtrahiert dann f3-1 (0, 1, 2), was zu (3-2, 3-1, 3-0) oder (6-2, führt). 6-1, 6-0) W5.
Golfscript und die Zufallsfunktion existierten, bevor diese Frage gestellt wurde, ebenso wie eine rechtliche Einreichung.
Dies ist die einmalige Übermittlung. Wenn Sie es mehrmals in einem Anruf ausführen müssen,
GolfScript , 12 Bytes
Probieren Sie es online aus!
Dadurch wird Ihr i-Aufruf auf 0 zurückgesetzt, sodass er entsprechend zurückgesetzt wird. Diese TIO zeigt 50 zufällige Ergebnisse.
quelle
C (gcc) , 31 Bytes
Alle 6 Anrufe ist die Wahrscheinlichkeit, dass jede Nummer zwischen 1 und einschließlich 6 generiert wird, gleich.
c
ist#define
d als Aufruf einer Funktion, die die perfekten Zufallszahlen erzeugt.Probieren Sie es online aus!
quelle