【问题标题】:NIST Suite Test for Nonlinear dynamical system非线性动力系统的 NIST Suite 测试
【发布时间】:2021-12-31 14:48:25
【问题描述】:

在我的以下代码中,我正在运行一个洛伦兹混沌方程,从中我将得到 xs、ys 和 zs 方面的随机数

import numpy as np
def lorenz(x, y, z, a=10,b=8/3,c=28 ):
            x_dot = a*(y -x) 
            y_dot = - y +c*x - x*z
            z_dot = -b*z + x*y
            return x_dot, y_dot, z_dot
       
dt = 0.01
num_steps =  10000
# Need one more for the initial values
xs = np.empty(num_steps + 1)
ys = np.empty(num_steps + 1)
zs = np.empty(num_steps + 1)


# Set initial values
xs[0], ys[0], zs[0]= (1,1,1)
# Step through "time", calculating the partial derivatives at the current point
# and using them to estimate the next point
for i in range(num_steps):
    x_dot, y_dot, z_dot= lorenz(xs[i], ys[i], zs[i])
    xs[i + 1] = xs[i] + (x_dot * dt)
    ys[i + 1] = ys[i] + (y_dot * dt)
    zs[i + 1] = zs[i] + (z_dot * dt)

我实际上是在尝试使用下面的代码通过 NIST 800 测试随机数生成测试的 xs、ys 和 zs 值

from __future__ import print_function

import math
from fractions import Fraction
from scipy.special import gamma, gammainc, gammaincc
# from gamma_functions import *
import numpy
import cmath
import random

#ones_table = [bin(i)[2:].count('1') for i in range(256)]
def count_ones_zeroes(bits):
    ones = 0
    zeroes = 0
    for bit in bits:
        if (bit == 1):
            ones += 1
        else:
            zeroes += 1
    return (zeroes,ones)

def runs_test(bits):
    n = len(bits)
    zeroes,ones = count_ones_zeroes(bits)

    prop = float(ones)/float(n)
    print("  prop ",prop)

    tau = 2.0/math.sqrt(n)
    print("  tau ",tau)

    if abs(prop-0.5) > tau:
        return (False,0.0,None)

    vobs = 1.0
    for i in range(n-1):
        if bits[i] != bits[i+1]:
            vobs += 1.0

    print("  vobs ",vobs)
      
    p = math.erfc(abs(vobs - (2.0*n*prop*(1.0-prop)))/(2.0*math.sqrt(2.0*n)*prop*(1-prop) ))
    success = (p >= 0.01)
    return (success,p,None)
print(runs_test(xs))
#%%
from __future__ import print_function

import math

def count_ones_zeroes(bits):
    ones = 0
    zeroes = 0
    for bit in bits:
        if (bit == 1):
            ones += 1
        else:
            zeroes += 1
    return (zeroes,ones)

def monobit_test(bits):
    n = len(bits)
    
    zeroes,ones = count_ones_zeroes(bits)
    s = abs(ones-zeroes)
    print("  Ones count   = %d" % ones)
    print("  Zeroes count = %d" % zeroes)
    
    p = math.erfc(float(s)/(math.sqrt(float(n)) * math.sqrt(2.0)))
    
    success = (p >= 0.01)
    return (success,p,None)
print(runs_test(xs))

我得到的输出是假的,即

输出: 道具 0.00019998000199980003 头 0.01999900007499375 (假,0.0,无)

我现在该怎么办?

【问题讨论】:

    标签: python python-3.x random chaos nist


    【解决方案1】:

    洛伦兹系统是混乱的,不是随机的。您很好地实现了微分方程求解器,但似乎count_ones_zeroes 并没有像它的名字所暗示的那样做,至少在您提供的数据上没有。在xs 上,它返回(zeroes, ones) = (9999, 2),这不是您想要的。代码检查xs 数组中的值,即x 值(例如8.2)对1,但x 是介于-20 和20 之间的浮点数,因此它通常为非1,并且将被计为0. 只有x==1会被计为1。

    在 python 中,int/int 会产生浮点数,因此无需将其强制转换为浮点数,这与例如C 或 C++,因此您可以编写 prop = ones/n,而不是 prop = float(ones)/float(n),类似的语句适用于 +、- 和 *

    【讨论】:

    • 感谢@Daniel,但问题是我需要一个 NIST 套件,它可以真正为我的差分系统计算 p 值。您的答案似乎是正确的,但预期值仍然不符合预期。虽然微分方程系统是混沌而不是随机的,但研究人员仍然使用 NIST 测试来测试他们的混沌系统
    • 你能帮我找到一个 NIST python 代码来测试我的混沌系统吗?
    • NIST 800 是一堆出版物吗?其中哪一个用于测试随机数生成器的质量?哪里有详细说明它在什么意义上是合适的工具的论文?
    • doi.org/10.1016/j.vlsi.2021.03.006 研究文章之一... 他们使用 NIST 处理从微分方程系统生成的混沌系统数据。请注意,这不仅仅是一篇论文,还有几篇研究文章使用 NIST 测试了混沌数据的随机性
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多