Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą nmniejszą niż 2^30określona jako dane wejściowe w dowolny sposób, jaki wybierzesz, twój kod powinien wypisywać losową liczbę całkowitą pomiędzy 0i nwłącznie. Wygenerowaną liczbę należy losowo wybierać równomiernie . Oznacza to, że każda wartość od 0do nmusi 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
0don. - 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()%nbędzie nie dać jednolity liczb losowych w ogóle. Jako przykład podany przez betseg, jeśliintmax == 15in = 10, wtedy będziesz o wiele bardziej prawdopodobne0-5niż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 = 75i funkcja jestrng()%75, wtedy 0-25 będzie bardziej powszechne ...)