我开发了一个简单的应用程序来生成测试数据系列,我构建它是为了能够使用随机种子进行重复。我注意到以下情况,并想知道为什么会发生这种情况:
>>> 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]请注意,对random()的单个调用是如何使用randint()的两个值的。我猜想这与在给定范围内生成浮点和int所需的随机信息量有关,但是有什么方法可以跟踪“到目前为止使用了多少个随机值吗?”,即系统的半随机值序列有多远?
最后,我编写了自己的函数,总是在逻辑中使用对random.random()的单个调用。所以我不是要一个解决方案,只是一些背景/解释。
发布于 2018-02-13 05:11:19
您的猜测是准确的,至少对于最新版本的CPython。在随机模块的代码中有几个相关的地方,您可以看到为什么会发生这种情况。我认为所有这些都是实现细节,但您可以看到,从本质上讲,需要生成32位随机位的组才能获得随机数。因此,获得53个随机比特(表示双倍的分数部分)使用的随机比特是获得4个随机比特的两倍。
关于能够判断已经生成了多少随机数据,提供的函数似乎不能给您提供一种简单可靠的方法。
https://stackoverflow.com/questions/48739457
复制相似问题