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("测试序列非随机!")
随机性检测之游程总数测试
猜你喜欢
转载自blog.csdn.net/weixin_43790779/article/details/105505412
今日推荐
周排行