Łatwo jest wygenerować uczciwą monetę za pomocą nieuczciwej monety, ale trudniej jest uzyskać odwrotność.
Twój program otrzyma jedną liczbę X (od 0 do 1 włącznie) jako dane wejściowe. Dane wejściowe nie mogą być po prostu zakodowane na stałe jako liczba w środku kodu źródłowego. Następnie musi zwrócić jedną cyfrę: a 1
z prawdopodobieństwem X, a 0
inaczej.
Twój program może używać tylko jednej formy generatora liczb losowych w kodzie źródłowym: int(rand(2))
(lub odpowiednika), która zwraca zero lub jeden z jednakowym prawdopodobieństwem. Możesz włączyć lub uzyskać dostęp do tej funkcji tyle razy, ile chcesz w swoim kodzie. Musisz również podać tę funkcję samodzielnie jako część kodu.
Twój program nie może używać żadnych innych funkcji generujących liczby losowe ani źródeł zewnętrznych (takich jak funkcje godziny i daty), które mogłyby działać jako funkcja generowania liczb losowych. Nie może również uzyskać dostępu do żadnych plików zewnętrznych ani przekazać zadania programom zewnętrznym.
To jest golf golfowy, wygrywa najkrótsza odpowiedź.
Odpowiedzi:
Perl, 37
42charPrzyjmuje dowolne prawdopodobieństwo jako argument wiersza poleceń. Buduje jednolitą liczbę losową
$d
i porównuje ją z danymi wejściowymi.Wcześniej 52-znakowe rozwiązanie
źródło
Python, 81 znaków
Może być trochę wyłączone, ale nigdy więcej niż 1%.
źródło
random.random() < desiredProbability
użyciem tego skryptu: gist.github.com/3656877 Pasują idealnie i.imgur.com/Hr8uE.pngrandom.random() < x
jest znacznie szybszy.Mathematica 165
Nie usprawniono, ale niektórzy mogą znaleźć interesujący algorytm:
Stosowanie
Czek
Zobaczmy, czy
f[.53]
naprawdę generuje wartość w1
około 53% przypadków. Każdy test oblicza% dla próbek 10 ^ 4.50 takich testów jest uruchamianych i uśrednianych.
Histogram wyników
Wyjaśnienie (alert spoilera!)
Podstawowa reprezentacja .53 to
Przechodząc od lewej do prawej, jedna cyfra na raz:
Jeśli RandomInteger [] zwraca 1, to odpowiedź = 1,
W przeciwnym razie Jeśli druga funkcja RandomInteger [] zwraca 0, to odpowiedź = 0,
W przeciwnym razie Jeśli trzeci RandomInteger [] zwraca 0, odpowiedź = 0,
Jeszcze....
Jeśli po przetestowaniu wszystkich cyfr nadal nie ma odpowiedzi, answer = RandomInteger [].
źródło
Haskell, 107 znaków:
źródło
Wolfram Language (Mathematica) , 42 bajty
Wypróbuj online!
To jest podejście rekurencyjne. Niegolfowany algorytm to:
p
jest mniejsze niż 1/2, to gdy coinflip wyniesie 0, zwróć 0. W przeciwnym razie powtórz dalej2p
; przy założeniu poprawności ogólne prawdopodobieństwo uzyskania 1 wynosi połowę2p
lubp
.p
jest większe niż 1/2, to gdy pojawi się spinacz monety 1, zwróć 1. W przeciwnym razie powtórz dalej2p-1
; przy założeniu poprawności ogólne prawdopodobieństwo uzyskania 0 wynosi połowę1-(2p-1)
lub1-p
.Krótko mówiąc, zaczynamy od losowego spinacza do monety, który w każdej gałęzi jest zwracany o połowę krócej. Jeśli spinacz nie pasuje do przypadku, w którym mamy go zwrócić, zastąp go wynikiem rekurencji w module
2p
1. (To znaczy, gdyp
jest mniejszy niż 1/2, zamień 1; kiedyp
jest większy niż 1/2 , zamień 0. Jest to równoważne zastąpieniu⌈1-2p⌉
.)źródło