Wprowadzenie
Otrzymujesz losowy generator liczb całkowitych z następującą implementacją
- Pierwsze wywołanie zawsze zwraca 1.
- Drugie wywołanie zwraca losową liczbę całkowitą od 1 do 2.
- Trzecie wywołanie zwraca losową liczbę całkowitą od 1 do 3.
- N-te wywołanie zwraca losową liczbę całkowitą od 1 do n włącznie.
Opierając się na powyższej funkcji, napisz losowy generator kości, który jest całkowicie losowy, zwracając wartość od 1 do 6 (włącznie) z jednakowym prawdopodobieństwem.
Zasady
- Twój program / funkcja powinna dać losową liczbę całkowitą od 1 do 6 włącznie, w pewnej użytecznej formie, tj. Do standardowego wyjścia lub jako wartość zwracaną przez funkcję.
- Generator rosnących liczb losowych powyżej można zdefiniować jako „darmową” funkcję w twoim programie (tj. Nie liczy się do liczby znaków) lub jako osobny skrypt / program, który jest wykonywany w razie potrzeby, zakładając, że stan (
n
) jest trwały między połączeniami. - Załóżmy, że w jednym przypadku użycia twojego programu nigdy nie będzie wymagane więcej niż 1000 rzutów kości, a początkowy generator liczb losowych można zresetować
1
na końcu 1000 rzutów kości, aby uniknąć przepełnienian
. - Twój program nie może używać żadnego innego źródła liczb losowych, z wyjątkiem rosnącego generatora losowego zdefiniowanego powyżej. Możesz oczywiście poprosić o wiele losowych liczb z generatora liczb losowych dla każdego wyniku rzutu pojedynczymi kostkami.
- To jest golf golfowy, więc zwycięzca jest najkrótszą odpowiedzią lub większością głosów w przypadku remisu. Jeśli możesz wygenerować 1000 rzutów kostką przy użyciu mniej niż 1000 losowych liczb, daj sobie 10-punktowy bonus wydajności .
Przykład
./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
nielegalny czy nie działa? Mogę nie rozumieć trzeciej zasady.Odpowiedzi:
J - 13 znaków
Przyjmuje to te same założenia co w Golfscript: że liczba kości jest w stdin i podajemy rzuty kostkami, które mają wyjść.
Wyjaśnione przez wybuch:
Jeśli jest to w jakiś sposób niezadowalające, oto dłuższy, 21-znakowy program, który można wywołać w
f''
celu wygenerowania liczb losowych, zawierających stan i wszystko.źródło
r:{*1_draw x}
, wersja stdin (10 znaków)r'1+!. 0:`
, wersja funkcji (14 znaków)c:0;f:{r@c+:1}
wywoływana przezf[]
.Python, 31 znaków
Podobnie jak scleaver, zdefiniuj generator tak:
Następnie funkcja zwracania rzutów kostką:
Dzwoń,
D()
gdy potrzebujesz równomiernie losowego rzutu kostką.źródło
Scala 23
Metoda r może być (w przybliżeniu) zaimplementowana w następujący sposób:
trudny test:
Co szóste połączenie powinno dawać równy rozkład między 6 wartościami, więc wyrzucam 5.
źródło
GolfScript (15 znaków)
Zakłada się, że wymagana liczba rolek jest podana na stdin, i podaje liczbę wyników do stdout.
Demo online
Chociaż mógłbym uzyskać premię 10 punktów za użycie mniej niż 1000 rzutów do wygenerowania 1000 liczb, kosztowałoby mnie to znacznie więcej niż 10 znaków. Trywialne podejście do wyodrębnienia odpowiedniej entropii, gdy N jest wielokrotnością potęgi 2 lub 3, jest zbyt krótkie, ponieważ liczba dostępnych wyników mod 3 wynosi tylko 333 + 111 + 37 + 12 + 4 + 1 = 498. Dlatego konieczne jest podejmij próbę i odrzuć. Dzięki takiemu podejściu można uzyskać 2242 rzuty z 1000 wywołań
r
, ale księgowaniebase
wiąże się z dodatkowymi kosztami i jest bardzo długą nazwą funkcji.źródło
base
jest bardzo długą nazwą funkcji” Najwyraźniej nie używasz Mathematica . Dostajemy takie cuda jakNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
, iSemialgebraicComponentInstances
. :-)Python
6563Ta funkcja
R()
to rosnący randomizator.Stosowanie:
źródło
for
pętli i po prostu zadzwonićR
przed niąwhile
?R()
zwraca liczbę zmiennoprzecinkową, a ty chwytałeś najmniej znaczącą cyfrę. Teraz, gdy wyjaśniono, żeR()
zwraca liczbę całkowitą, ma to sens.Python, 56
r jest zdefiniowane jako:
generator kości d:
użycie, np. na 100 rolek:
źródło
import math
, jeśli zastąpimath.ceil(...)
sięint(...)+1
Mathematica 51
Generator liczb losowych
r
jest resetowany przez ustawienie zmiennej globalnejn
na 1.Kod
Nie działa dla najkrótszego kodu ...
Stosowanie
60000 rzutów kości wymagało 60031 połączeń z
h
.Tally
pokazuje podział według liczb 1-6.źródło
Perl, 22 lub 45
Wdrożenie rosnącego generatora liczb losowych:
Generowanie:
Testowanie:
źródło
JavaScript (Node.js) , 35 bajtów
Wypróbuj online!
źródło
kod operacji x86, 15 bajtów
źródło
GolfScript , 8 bajtów
Wypróbuj online!
Wyskakuje generator raz, a następnie pozbywa się wyniku. Następnie rzuca f2 i mnoży go przez 3 (3 lub 6), a następnie odejmuje f3-1 (0, 1, 2), co daje (3-2, 3-1, 3-0) lub (6-2, 6-1, 6-0) W5.
Golfscript i funkcja losowa istniały przed opublikowaniem tego pytania, podobnie jak zgłoszenie prawne.
Jest to przesłanie jednorazowe. Jeśli musisz uruchomić go kilka razy w jednym połączeniu,
GolfScript , 12 bajtów
Wypróbuj online!
Spowoduje to zresetowanie twojego połączenia i do 0, więc odpowiednio zresetuje się. To TIO pokazuje 50 losowych wyników.
źródło
C (gcc) , 31 bajtów
Co 6 połączeń prawdopodobieństwo wygenerowania każdej liczby od 1 do 6 włącznie jest równe.
c
jest#define
d jako wywołanie funkcji, która generuje idealne liczby losowe.Wypróbuj online!
źródło