其他答复已经澄清说,其中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
生成的最大可能数字是精确的。
零点九九九九九九九九九九九九九九九九八八九七七六九七五三七四八三四五九五七六三六八三三一九零九一七九六八。