为何仅random.random()多次运行生成不同值?其他随机函数输出相同?
这是我使用的代码:
import random as r count = 0 num1 = 0 num2 = 1
我们使用这个数值是因为random模块生成的是15位小数,由此可产生437893890381000000种组合。
while num1 != num2 or count <= 437893890381000000: num1 = r.random() num2 = r.random() count+=1 print(count,' num1= ',num1,' num2= ',num2) print('after ',count,' times, the code generated same numbers as: ',num1,' ',num2)
该代码运行了数百万次,仍未出现相同的输出结果。
核心原因解析
伪随机数生成器的超长周期
Python的random模块基于Mersenne Twister算法,它的周期长达2^19937-1——这个数值远超你提到的4.3e17种组合。在周期范围内,伪随机数序列不会出现重复,你运行的数百万次和这个周期相比可以忽略不计,因此不会产生重复值。random.random()的输出基数极大
random.random()返回[0.0, 1.0)区间的浮点数,内部用53位二进制精度存储(对应十进制约15-17位有效数字),总共有2^53种可能取值,约9e15种。按照生日悖论计算,需要采样约3e7次才会有50%概率出现重复,数百万次还远未达到这个阈值。“其他随机函数重复”的真相
所谓“其他随机函数输出相同结果”,大多是两种情况:一是手动设置了相同的随机种子,导致生成固定序列;二是使用了输出范围极小的函数(比如randint(1,10)这类有限区间的函数),重复概率自然更高。如果未手动设种子,random模块会用系统时间等熵源初始化,所有随机函数都会基于唯一状态生成不重复序列。
你的代码逻辑问题
循环条件num1 != num2 or count <= 437893890381000000存在错误:or逻辑会让循环在count未达上限时一直执行,不管num1和num2是否相等。正确条件应为while num1 != num2 and count <= 437893890381000000——但即便修正,你也几乎不可能看到循环结束,因为重复概率实在太低。
内容的提问来源于stack exchange,提问作者Rishi Bhati

