使用真随机数作为种子生成的数值是否属于真随机数?
骰子作为种子生成1-100随机数的问题解答
生成结果是否为真随机数?
不是真随机数,核心原因有两点:
- 主流编程语言内置的随机生成函数均为伪随机数生成器(PRNG),本质是确定性数学算法:只要输入的种子相同,后续输出的所有数值序列完全可复现,不具备真随机数的不可预测性。
- 单枚6面骰子单次掷出的结果最多只有≈2.58比特的熵,远低于生成1-100区间均匀随机数所需的≈6.64比特熵,熵源本身的信息量就不足以支撑目标区间的真随机生成需求。
基于该随机源的最优生成方法
最优方案是直接使用多次骰子投掷结果做拒绝采样,完全绕开伪随机数生成器,既保证结果的均匀性,也能保留物理骰子的真随机特性,具体实现逻辑如下:
- 每次掷骰子后将结果减1,得到0~5的数值,对应6进制的一位数
- 连续掷3次骰子,将三次结果拼接为一个6进制数,可覆盖0~215的所有整数(6³=216)
- 若得到的数值≥200则丢弃该结果,重新掷3次骰子;若<200则对100取模后加1,即可得到1~100区间的均匀随机数
该方法的单次生成成功率为200/216≈92.6%,平均仅需掷3.24次骰子即可得到一个有效结果,效率极高。以下是Python参考实现(实际使用时替换掉模拟骰子的代码,改为读取物理骰子的掷出结果即可):
# 模拟物理骰子掷出,实际使用时替换为真实的骰子结果输入 def roll_dice() -> int: from random import randint return randint(1, 6) def generate_1_100() -> int: while True: # 三次掷骰子拼接为6进制数 val = (roll_dice()-1) * 36 + (roll_dice()-1) * 6 + (roll_dice()-1) if val < 200: return val % 100 + 1
内容的提问来源于stack exchange,提问作者sf99sL
相关产品推荐
相关产品推荐

