为什么random.random()会占用两个random.randint()值?

Gri*_*mar 6 python random

我开发了一个生成测试数据系列的简单应用程序,并且我使用随机种子将其构建为可重复的.我注意到以下内容并想知道为什么会发生这种情况:

>>> random.seed(1)
>>> [random.randint(0,10) for _ in range(0,10)]
[2, 9, 1, 4, 1, 7, 7, 7, 10, 6]
>>> random.seed(1)
>>> random.random()
0.13436424411240122
>>> [random.randint(0,10) for _ in range(0,10)]
[1, 4, 1, 7, 7, 7, 10, 6, 3, 1]
Run Code Online (Sandbox Code Playgroud)

注意对random()的单个调用如何使用randint()的两个值.我猜这与在给定范围内生成浮点数与int值所需的随机信息量有关,但是有没有办法跟踪到目前为止使用了多少随机值? ,即系统的半随机值序列有多远?

我最终编写了自己的函数,总是在其逻辑中使用random.random().所以我不是要求解决方案,只是一些背景/解释.

Qui*_*mer 0

你的猜测是准确的,至少对于最新版本的 CPython 来说是这样。random 模块的代码中有几个相关位置,您可以在其中了解发生这种情况的原因。我将所有这些视为实现细节,但您可以看到,本质上,根据需要生成 32 个随机位组来获取随机数。因此,获取 53 个随机位(表示双精度数的小数部分)使用的随机位数量是获取 4 个随机位的两倍。

关于能够知道生成了多少随机数据,所提供的函数似乎并没有为您提供一种简单可靠的方法来做到这一点。