задача
Если положительное целое число n
меньше 2^30
указанного в качестве входного значения любым выбранным вами способом, ваш код должен выдавать случайное целое число между 0
и n
включительно. Число, которое вы генерируете, должно выбираться случайным образом равномерно . То есть каждое значение от 0
до n
должно происходить с равной вероятностью (см. Правила и предостережения).
Правила и предостережения
Ваш код может предполагать, что любой генератор случайных чисел, встроенный в ваш язык или стандартную библиотеку, который утверждает, что он является равномерно случайным, на самом деле является единообразным. То есть вам не нужно беспокоиться о качестве используемого вами случайного источника. Тем не мение,
- Вы должны установить, что если используемый вами случайный источник является однородным, то ваш код правильно выводит равномерное случайное целое число из
0
вn
. - Любые аргументы при вызове встроенной или библиотечной случайной функции должны быть постоянными. То есть они должны быть полностью независимы от входного значения.
- Ваш код может завершиться с вероятностью 1, а не гарантированно завершить.
Заметки
randInt(0,n)
недопустимо, поскольку принимает входные данные в качестве аргумента встроенной или библиотечной функции.rand()%n
не будет давать равномерное случайное число в целом. В качестве примера, приведенного Betseg, еслиintmax == 15
иn = 10
, то вы будете иметь гораздо больше шансов,0-5
чем6-10
.floor(randomfloat()*(n+1))
также не будет давать равномерное случайное число в целом из-за конечного числа различных возможных значений с плавающей запятой между 0 и 1.
rng()
обеспечивает0
-100
, еслиn = 75
и функция естьrng()%75
, то 0-25 будет более распространенным ...)