随机性检测之游程总数测试

from math import *

#将十六进制字符串转换为二进制列表
def Convert(hexInput):
    bitStr = int(hexInput,16)
    bit = list(bin(bitStr))[2:]
    bit = list(map(int,bit))
    return bit

#读入十六进制数据
txtRead = open("8KB_randomPlainText_0.txt","rb")
#hexInput = input("请输入测试序列:")
hexInput = txtRead.read()
txtRead.close()
#print("hexInput:{}".format(hexInput))

sum0 = 0                #sum0保存二元序列每位数相加之和
r = 0                   #保存r(k)之和
bits = Convert(hexInput)
n = len(bits)           #保存二元序列的长度
#print("n:{}".format(n))
for i in bits:
    sum0 = sum0 + i
per = sum0/n            #二元序列1的占比
t = 2/ sqrt(n)

#print("per:{}".format(per))
#print("t:{}".format(t))
#判断执行测试的前提条件
if abs(per - 0.5) < t:
    #计算卡方统计量的观察值
    for i in range(0,n-1):
        if bits[i] == bits[i+1]:
            r = r + 0
        else:
            r = r + 1

    v = r + 1
    #print(v)
    P_value = erfc(abs(v-2*n*per*(1-per)) /  (2*sqrt(2*n)*per*(1-per)))
    print("P_value:{}".format(P_value))
    if P_value >= 0.01:
        print("测试序列随机!")
    else:
        print("测试序列非随机!")
    
else:
    P_value = 0
    print("P_value:{}".format(P_value))
    print("测试序列非随机!")

发布了31 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43790779/article/details/105505412