如何不依赖任何库从零实现Python随机函数?
从零实现0到1的伪随机数生成函数
首先得明确:我们平时用的“随机数”大多是伪随机数——通过确定性算法生成的、看起来随机的序列,只要初始种子固定,生成的序列就完全一致。如果要完全不依赖任何库,最容易上手实现的是线性同余生成器(LCG),它的核心公式很简单:
next_seed = (a * current_seed + c) % m
其中a(乘数)、c(增量)、m(模数)是需要精心选择的参数,选得好能让生成的序列周期足够长、分布均匀。这里我们用glibc标准库中使用的经典参数:a=1103515245,c=12345,m=2^31。
下面是具体实现:
# 全局变量保存当前种子,初始值可自定义 _current_seed = 12345 def getRandom(): global _current_seed # 用LCG公式更新种子 _current_seed = (1103515245 * _current_seed + 12345) % (1 << 31) # 将整数转换为0 ≤ n < 1的浮点数 return _current_seed / (1 << 31)
关键步骤解释
- 种子维护:用全局变量
_current_seed保存当前状态,每次调用函数都会更新这个种子,确保下一次生成的数和之前不同。 - LCG计算:按照公式生成下一个整数种子,这个整数的范围是
0到2^31 - 1。 - 转换为浮点数:将生成的整数除以
2^31,就能把范围映射到0.0 ≤ n < 1.0——因为最大的整数是2^31 -1,除以2^31后结果小于1。
补充说明
如果想要更“随机”的初始种子,你可以手动修改_current_seed的初始值(比如用当前时间的数值,但这需要导入time库,不符合“零依赖”要求)。另外,伪随机数不适合用于加密场景,加密需要专门的密码学安全随机数生成器,但日常测试、模拟场景用这个实现完全足够。
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

