Es ist einfach, eine faire Münze mit einer unfairen Münze zu generieren, aber das Gegenteil ist schwieriger zu erreichen.
Ihr Programm erhält eine Ziffer X (zwischen 0 und 1) als Eingabe. Die Eingabe darf nicht einfach als Zahl in der Mitte des Quellcodes fest codiert werden. Es muss dann eine einzelne Ziffer zurückgeben: a 1
mit einer Wahrscheinlichkeit von X und a 0
ansonsten.
Ihr Programm darf nur eine Form des Zufallszahlengenerators im Quellcode verwenden: int(rand(2))
(oder eine gleichwertige), die entweder eine Null oder eine Eins mit gleicher Wahrscheinlichkeit zurückgibt. Sie können diese Funktion beliebig oft in Ihren Code aufnehmen oder darauf zugreifen. Sie müssen die Funktion auch selbst als Teil des Codes bereitstellen.
Ihr Programm darf keine anderen Funktionen zur Generierung von Zufallszahlen oder externe Quellen (wie Uhrzeit- und Datumsfunktionen) verwenden, die als Funktion zur Generierung von Zufallszahlen fungieren könnten. Es kann auch nicht auf externe Dateien zugreifen oder den Auftrag an externe Programme weitergeben.
Dies ist Code Golf, die kürzeste Antwort gewinnt.
Antworten:
Perl, 37
42charNimmt eine beliebige Wahrscheinlichkeit als Befehlszeilenargument. Baut eine einheitliche Zufallszahl auf
$d
und vergleicht sie mit der Eingabe.Früher 52 Zeichen Lösung
quelle
Python, 81 Zeichen
Kann etwas abweichen, aber niemals mehr als 1%.
quelle
random.random() < desiredProbability
Verwendung dieses Skripts verglichen : gist.github.com/3656877 Sie stimmen perfekt überein i.imgur.com/Hr8uE.pngrandom.random() < x
erheblich schneller ist.Mathematica 165
Nicht optimiert, aber einige finden den Algorithmus von Interesse:
Verwendung
Prüfen
Mal sehen, ob
f[.53]
der Wert tatsächlich in1
53% der Fälle erreicht wird. Jeder Test berechnet die% für Proben von 10 ^ 4.50 solcher Tests werden ausgeführt und gemittelt.
Histogramm der Ergebnisse
Erklärung (Spoiler Alarm!)
Die Basis 2 Darstellung von .53 ist
Von links nach rechts fortfahren, eine Ziffer nach der anderen:
Wenn RandomInteger [] 1 zurückgibt, ist answer = 1,
Sonst Wenn zweite RandomInteger [] 0 zurückgibt, dann antworte = 0,
Sonst Wenn dritte RandomInteger [] 0 zurückgibt, ist die Antwort = 0,
Sonst....
Wenn nach dem Testen aller Ziffern immer noch keine Antwort vorliegt, ist answer = RandomInteger [].
quelle
Haskell, 107 Zeichen:
quelle
Wolfram Language (Mathematica) , 42 Byte
Probieren Sie es online!
Dies ist ein rekursiver Ansatz. Ungolfed, der Algorithmus ist:
p
kleiner als 1/2 ist, geben Sie 0 zurück, wenn der Münzwurf 0 ergibt2p
. Unter der Annahme der Korrektheit beträgt die Gesamtwahrscheinlichkeit, eine 1 zu erhalten, die Hälfte von2p
oderp
.p
größer als 1/2 ist, geben Sie 1 zurück, wenn der Münzwurf 1 ergibt2p-1
. Unter der Annahme der Korrektheit beträgt die Gesamtwahrscheinlichkeit, 0 zu erhalten, die Hälfte von1-(2p-1)
oder1-p
.Um es kürzer zu machen, beginnen wir mit dem zufälligen Coinflip, der in beiden Zweigen die Hälfte der Zeit zurückgegeben wird. Wenn der Münzwurf nicht mit dem Fall übereinstimmt, in dem er zurückgegeben werden soll, ersetzen Sie ihn durch das Ergebnis der Rekursion von
2p
Modulo 1. (Wennp
also weniger als 1/2 ist, ersetzen Sie 1; wennp
größer als 1/2 ist , 0 ersetzen. Dies entspricht dem Ersetzen⌈1-2p⌉
.)quelle