Диапазон python random.random() из стандартной библиотеки
Возвращает ли python random.random() когда-либо 1.0 или он возвращается только до 0.9999..?
Ответы
Ответ 1
Документы находятся здесь: http://docs.python.org/library/random.html
... random(), который генерирует случайный поплавок равномерно в полуоткрытый диапазон [0,0, 1,0].
Таким образом, возвращаемое значение будет больше или равно 0 и меньше 1,0.
Ответ 2
>>> help(random.random)
Help on built-in function random:
random(...)
random() -> x in the interval [0, 1).
Это означает, что 1 исключается.
Ответ 3
Другие ответы уже уточнили, что 1 не входит в диапазон, но из любопытства я решил посмотреть источник, чтобы точно узнать, как он рассчитывается.
Источник CPython можно найти здесь
/* random_random is the function named genrand_res53 in the original code;
* generates a random number on [0,1) with 53-bit resolution; note that
* 9007199254740992 == 2**53; I assume they're spelling "/2**53" as
* multiply-by-reciprocal in the (likely vain) hope that the compiler will
* optimize the division away at compile-time. 67108864 is 2**26. In
* effect, a contains 27 random bits shifted left 26, and b fills in the
* lower 26 bits of the 53-bit numerator.
* The orginal code credited Isaku Wada for this algorithm, 2002/01/09.
*/
static PyObject *
random_random(RandomObject *self)
{
unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6;
return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));
}
Таким образом, функция эффективно генерирует m/2^53
, где 0 <= m < 2^53
- целое число. Так как поплавки имеют 53 бит точности, это означает, что на диапазоне [1/2, 1) генерируется каждый возможный поплавок. Для значений, близких к 0, он пропускает некоторые возможные значения поплавка для эффективности, но сгенерированные числа равномерно распределяются в пределах диапазона. Наибольшее возможное число, порожденное random.random
, является точно
0,99999999999999988897769753748434595763683319091796875
Ответ 4
Python random.random
возвращает числа, которые меньше, но не равны, 1
.
Однако он может вернуться 0
.
Ответ 5
Из кода в ответах Antimony легко видеть, что random.random() никогда не возвращает ровно 1.0 на платформах, которые имеют не менее 53 бит мантиссы для вычислений с константами, не аннотированными с помощью 'f' в C. Точность IEEE 754 предписывает и является стандартным сегодня.
Однако на платформах с меньшей точностью, например, если Python скомпилирован с -fsingle-precision-constant для использования на встроенной платформе, добавление b к * 67108864.0 может привести к округлению до 2 ^ 53, если b близко достаточно до 2 ^ 26, и это будет означать, что 1.0 возвращается. Обратите внимание, что это происходит независимо от точности функции Python PyFloat_FromDouble.
Один из способов проверить это - проверить несколько сотен случайных чисел, будет ли 53-й бит когда-либо 1. Если это по крайней мере один раз, это доказывает достаточную точность, и вы в порядке. Если нет, округление - наиболее вероятное объяснение, означающее, что random.random() может возвращать 1.0. Конечно, возможно, вам просто не повезло. Вы можете подталкивать определенность настолько высоко, насколько хотите, тестируя больше чисел.