Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą n
mniejszą niż 2^30
określona jako dane wejściowe w dowolny sposób, jaki wybierzesz, twój kod powinien wypisywać losową liczbę całkowitą pomiędzy 0
i n
włącznie. Wygenerowaną liczbę należy losowo wybierać równomiernie . Oznacza to, że każda wartość od 0
do n
musi wystąpić z jednakowym prawdopodobieństwem (patrz Reguły i zastrzeżenia).
Zasady i zastrzeżenia
Twój kod może zakładać, że dowolny generator liczb losowych wbudowany w Twój język lub standardową bibliotekę, który twierdzi, że jest jednolicie losowy, jest w rzeczywistości jednolity. Oznacza to, że nie musisz się martwić o jakość losowego źródła, którego używasz. Jednak,
- Musisz ustalić, że jeśli losowe źródło, którego używasz, jest jednolite, kod poprawnie wypisuje jednolitą losową liczbę całkowitą od
0
don
. - Wszelkie argumenty podczas wywoływania funkcji losowej wbudowanej lub bibliotecznej muszą być stałe. Oznacza to, że muszą być całkowicie niezależne od wartości wejściowej.
- Twój kod może zostać zakończony z prawdopodobieństwem 1, a nie gwarantowany.
Uwagi
randInt(0,n)
nie jest poprawny, ponieważ pobiera dane wejściowe jako argument do funkcji wbudowanej lub biblioteki.rand()%n
będzie nie dać jednolity liczb losowych w ogóle. Jako przykład podany przez betseg, jeśliintmax == 15
in = 10
, wtedy będziesz o wiele bardziej prawdopodobne0-5
niż6-10
.floor(randomfloat()*(n+1))
nie da również ogólnie jednolitej liczby losowej ze względu na skończoną liczbę różnych możliwych wartości zmiennoprzecinkowych od 0 do 1.
rng()
zapewnia0
-100
, jeślin = 75
i funkcja jestrng()%75
, wtedy 0-25 będzie bardziej powszechne ...)