You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Lorenz混沌系统的序列NIST 800随机性测试失败解决方案咨询

基于Lorenz混沌序列生成可通过NIST 800测试的随机数调整方案

核心问题定位

你当前测试失败的最直接原因是:NIST随机性测试的所有检测项输入要求是0/1组成的二进制比特序列,你直接将Lorenz输出的浮点型xs序列传入测试函数,函数判断bit == 1的样本占比仅为0.02%,远低于随机性要求的50%左右占比,因此直接判定失败。

具体调整步骤

  • 第一步:丢弃混沌迭代的过渡态序列
    Lorenz系统初始迭代的前数千个点尚未进入稳定混沌吸引子,序列存在明显的趋势性,直接丢弃前1000~2000个迭代点,仅保留进入混沌状态后的序列。
  • 第二步:降低相邻点相关性
    你当前每迭代1步就采样1次,相邻点的数值关联性极强,调整为每迭代10~20步才采样1个点,大幅降低序列的自相关性。
  • 第三步:将浮点序列转换为二进制比特序列
    不要直接使用浮点数本身,提取每个浮点数的低有效位作为比特输出:
    示例处理逻辑:
    # 示例:提取每个浮点数小数部分的最后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个
    
    也可以将xs、ys、zs三个通道的比特做异或合并,进一步提升随机性:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:06