如何修复Python伪随机数生成无法输出0-0.1区间数值的问题?
解决思路
首先明确问题根源:你当前用10 ** (len(str(decoded)))作为除数,而decoded是SHA3-512哈希转成的十进制整数,它的十进制首位必然是1-9,因此计算结果最小是0.1开头的数,自然无法覆盖0~0.1区间。
下面是几个无需大幅改动代码的修复方案:
方案一:用哈希的最大可能值作为除数
SHA3-512生成的是512位的二进制哈希,对应的十进制整数范围是0到2**512 - 1。直接用这个最大值作为除数,就能得到01之间的均匀分布数值,完全覆盖00.1区间。
修改后的代码:
import hashlib import time def random(): hashtime = str(int(time.time() * (10 ** 6))) encoded = hashlib.new("sha3_512", hashtime.encode()) decoded = int(encoded.hexdigest(), 16) # 替换除数为SHA3-512的最大可能值 dcsmall = decoded / (2 ** 512) return dcsmall
方案二:取哈希值的部分位数转换(可选)
如果不想用大指数计算,也可以截取哈希十六进制字符串的前N位转成整数,再除以16**N(十六进制的最大对应值),同样能得到0~1的数值,比如取前16位:
import hashlib import time def random(): hashtime = str(int(time.time() * (10 ** 6))) encoded = hashlib.new("sha3_512", hashtime.encode()) # 截取前16位十六进制字符 hex_str = encoded.hexdigest()[:16] decoded = int(hex_str, 16) dcsmall = decoded / (16 ** 16) return dcsmall
额外优化小建议
- 可以考虑加入更多熵源(比如当前进程ID
os.getpid()),避免短时间内多次调用生成重复值,不过这属于可选的小幅改动:import os # ... hashtime = str(int(time.time() * (10 ** 6))) + str(os.getpid())
内容的提问来源于stack exchange,提问作者Linus 1804
相关产品推荐
相关产品推荐

