基于Lorenz混沌系统的序列NIST 800随机性测试失败解决方案咨询
基于Lorenz混沌序列生成可通过NIST 800测试的随机数调整方案
核心问题定位
你当前测试失败的最直接原因是:NIST随机性测试的所有检测项输入要求是0/1组成的二进制比特序列,你直接将Lorenz输出的浮点型xs序列传入测试函数,函数判断bit == 1的样本占比仅为0.02%,远低于随机性要求的50%左右占比,因此直接判定失败。
具体调整步骤
- 第一步:丢弃混沌迭代的过渡态序列
Lorenz系统初始迭代的前数千个点尚未进入稳定混沌吸引子,序列存在明显的趋势性,直接丢弃前1000~2000个迭代点,仅保留进入混沌状态后的序列。 - 第二步:降低相邻点相关性
你当前每迭代1步就采样1次,相邻点的数值关联性极强,调整为每迭代10~20步才采样1个点,大幅降低序列的自相关性。 - 第三步:将浮点序列转换为二进制比特序列
不要直接使用浮点数本身,提取每个浮点数的低有效位作为比特输出:
示例处理逻辑:
也可以将xs、ys、zs三个通道的比特做异或合并,进一步提升随机性:# 示例:提取每个浮点数小数部分的最后1位比特 def float_to_bit(x): # 取小数部分乘以2^16后模2,得到低有效位 return int((x - int(x)) * 65536) % 2 # 转换xs为比特序列 bits = [float_to_bit(x) for x in xs[2000::10]] # 跳过前2000点,每10步取1个def get_combined_bit(x,y,z): bx = int((x - int(x)) * 65536) %2 by = int((y - int(y)) * 65536) %2 bz = int((z - int(z)) * 65536) %2 return bx ^ by ^ bz - 第四步:保证测试序列长度符合要求
NIST 800测试要求输入比特序列长度至少为10^6比特,你当前仅1万个采样点,长度远远不足,调整迭代次数到至少10万次以上,生成足够长度的比特序列再进行测试。 - 第五步:修正测试代码的调用逻辑
你当前的测试代码最后调用的是runs_test(xs),应该改为调用转换后的比特序列,且单比特测试、游程测试等多个测试项都要覆盖,不要仅测试单个项。
内容的提问来源于stack exchange,提问作者Zewo
相关产品推荐
相关产品推荐

