最近科研的需要,需要测试二进制序列的随机性

找遍所有内网都没有找到自己合适的代码,网上很多都是讲解自己怎么去下载和安装sts-2.1.2的开发包,于是我也是一开始就入坑了,之前也是写了一篇比较完整的工具包的下载和安装的教程,点击打开链接,但是如果你按照我的安装步骤的话,成功安装肯定是没有问题的,但是你的使用就会出现各种各样的问题:

比如我在使用的过程中遇到的问题有:首先,就是经常出现UNDERFLOW的情况,这种情况下,一般都是因为数据量不够大的情况下造成的,所以如果你用过,你就会发现,想要测试15项的内容,大约你需要1GBit,这对于我们正常的情况下,是非常难的,根本达不到这个数据量,没错,肯定有的人会说,你可以不测试那么多的数据量啊 ,你可以测试部分的测试项啊,我也想啊,但是网上根本没有发现怎么使用,单独测试,而不是使用15项

我按照他的步骤,每次单独测试的时候总是会出现下面的情况,(我不知道你们有没有遇到)

看这个提示:如果你不想测试所有的项,请输入0,否则输入1.

然后我就输入0

从这里开始,无论你输入0还是1,都是没有响应了。我一直也没有找到任何解决的办法,如果有人知道,请留言交流。

但是又因为迫于科研的压力,还是要解决这个事情,这个是NIST的官方文档

参考开发文档,和国外大牛写的代码:整理并编写python如下:

这里把15个测试项都单独的编写了一个可以运行的python代码:

先看一下我的结果图:有两项不pass,13项success、

第一个是:

cumulative_sums_test
import math
#from scipy.special import gamma, gammainc, gammaincc
from gamma_functions import *
#import scipy.statsdef normcdf(n):return 0.5 * math.erfc(-n * math.sqrt(0.5))def p_value(n,z):sum_a = 0.0startk = int(math.floor((((float(-n)/z)+1.0)/4.0)))endk   = int(math.floor((((float(n)/z)-1.0)/4.0)))for k in range(startk,endk+1):c = (((4.0*k)+1.0)*z)/math.sqrt(n)#d = scipy.stats.norm.cdf(c)d = normcdf(c)c = (((4.0*k)-1.0)*z)/math.sqrt(n)#e = scipy.stats.norm.cdf(c)e = normcdf(c)sum_a = sum_a + d - esum_b = 0.0startk = int(math.floor((((float(-n)/z)-3.0)/4.0)))endk   = int(math.floor((((float(n)/z)-1.0)/4.0)))for k in range(startk,endk+1):c = (((4.0*k)+3.0)*z)/math.sqrt(n)#d = scipy.stats.norm.cdf(c)d = normcdf(c)c = (((4.0*k)+1.0)*z)/math.sqrt(n)#e = scipy.stats.norm.cdf(c)e = normcdf(c)sum_b = sum_b + d - e p = 1.0 - sum_a + sum_breturn pdef cumulative_sums_test(bits):n = len(bits)# Step 1x = list()             # Convert to +1,-1for bit in bits:#if bit == 0:x.append((bit*2)-1)# Steps 2 and 3 Combined# Compute the partial sum and records the largest excursion.pos = 0forward_max = 0for e in x:pos = pos+eif abs(pos) > forward_max:forward_max = abs(pos)pos = 0backward_max = 0for e in reversed(x):pos = pos+eif abs(pos) > backward_max:backward_max = abs(pos)# Step 4p_forward  = p_value(n, forward_max)p_backward = p_value(n,backward_max)success = ((p_forward >= 0.01) and (p_backward >= 0.01))plist = [p_forward, p_backward]if success:print ("PASS")else:    print ("FAIL: Data not random")return (success, None, plist)bits=[1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,1,0,1,1,1,0,0,1,1,1,1,1,0,0,0]
if __name__ == "__main__":#bits = [1,1,0,0,1,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1,# 1,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,#0,1,1,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,#0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,0,#0,1,1,0,0,0,1,0,1,0,0,0,1,0,1,1,1,0,0,0]success, _, plist = cumulative_sums_test(bits)print ("success =",success)print ("plist = ",plist) 

第二个是:maurers_universal_test

import mathdef pattern2int(pattern):l = len(pattern)n = 0for bit in (pattern):n = (n << 1) + bitreturn n          def maurers_universal_test(bits,patternlen=None, initblocks=None):n = len(bits)# Step 1. Choose the block sizeif patternlen != None:L = patternlen  else: ns = [904960,2068480,4654080,10342400,22753280,49643520,107560960,231669760,496435200,1059061760]L = 6if n < 387840:print ("Error. Need at least 387840 bits. Got %d." % n)exit()for threshold in ns:if n >= threshold:L += 1 # Step 2 Split the data into Q and K blocksnblocks = int(math.floor(n/L))if initblocks != None:Q = initblockselse:Q = 10*(2**L)K = nblocks - Q# Step 3 Construct Tablensymbols = (2**L)T=[0 for x in range(nsymbols)] # zero out the tablefor i in range(Q):             # Mark final position ofpattern = bits[i*L:(i+1)*L] # each patternidx = pattern2int(pattern)T[idx]=i+1      # +1 to number indexes 1..(2**L)+1# instead of 0..2**L# Step 4 Iteratesum = 0.0for i in range(Q,nblocks):pattern = bits[i*L:(i+1)*L]j = pattern2int(pattern)dist = i+1-T[j]T[j] = i+1sum = sum + math.log(dist,2)print ("  sum =", sum)# Step 5 Compute the test statisticfn = sum/Kprint ("  fn =",fn)# Step 6 Compute the P Value# Tables from https://static.aminer.org/pdf/PDF/000/120/333/# a_universal_statistical_test_for_random_bit_generators.pdfev_table =  [0,0.73264948,1.5374383,2.40160681,3.31122472,4.25342659,5.2177052,6.1962507,7.1836656,8.1764248,9.1723243,10.170032,11.168765,12.168070,13.167693,14.167488,15.167379]var_table = [0,0.690,1.338,1.901,2.358,2.705,2.954,3.125,3.238,3.311,3.356,3.384,3.401,3.410,3.416,3.419,3.421]# sigma = math.sqrt(var_table[L])mag = abs((fn - ev_table[L])/((math.sqrt(var_table[L]))*math.sqrt(2)))P = math.erfc(mag)success = (P >= 0.01)return (success, P, None)if __name__ == "__main__":#bits = [0,1,0,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,1,1]bits=[1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1,1,0,1,0,1,1,1,0,0,1,1,1,1,1,0,0,0] success, p, _ = maurers_universal_test(bits, patternlen=2, initblocks=4)print ("success =",success)print ("p       = ",p)

这个好没效率,15项的代码太多了,等我把资源上传到csdn吧,等审核通过,我再来附链接。

下载链接:点击打开链接

Python代码实现NIST随机性测试相关推荐

  1. 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)...

    让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett   译文出处:linux中国-Hank Chow    检查你的代码的质 ...

  2. PCA计算流程详解与实现(Python详细编码,全部测试正确,与sklearn完全一致,只有7行代码)

    如果无法理解一种算法的原理,那么就整理出它的流程,再在直接的计算过程中慢慢体会它的思想. – 我说的. 许多问题在一开始都很难理解其原理.像PCA这种经典的算法,其实从头至尾的每个步骤都非常严密,细节 ...

  3. python编写代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  4. python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 介绍 无论你使用哪种编程语言或框架,测试都非常重要.Hypothesis是 ...

  5. python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码

    我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...

  6. python测试代码与模块_测量Python代码运行时间

    Python 社区有句俗语: "python自己带着电池" ,别自己写计时框架. Python 2.3 具备一个叫做 timeit 的完美计时工具可以测量python代码的运行时间 ...

  7. python代码测试_Python入门学习系列——Python代码测试

    Python代码测试 对于编写的代码,可以使用unittest模块中的相关方法进行测试. 测试函数 首先定义一个简单的函数,该函数用来合并名称并返回. name_function.py: def ge ...

  8. Python代码—测试

    测试分为黑盒测试和白盒测试. 最简单的测试方法:即时测试.也就是编写一点代码,就测试一点. 1. 测试的一些基础知识 2. 测试工具(doctest.unittest) 3. 检查代码(PyLint. ...

  9. Python代码覆盖性测试入门

    覆盖测试通过代码分析工具和跟踪钩子来判断哪些代码可执行以及哪些代码被执行了,是对单元测试的有效补充,可以用来判断测试的有效性. Python扩展库coverage可以实现对Python代码的覆盖测试, ...

最新文章

  1. Intent四个重要属性
  2. 通过外部表改进一个繁琐的大查询
  3. Flash,EEPROM区别
  4. ZendStudio-v6.0注册机
  5. Spring学习(五)bean装配详解之 【XML方式配置】
  6. 万能无线键盘对码软件_Ceke M87蓝牙机械键盘拆解评测 - Mac小伴侣
  7. 【CodeForces - 735B】Urbanization (找规律,思维)
  8. 读书:我编程我快乐(一.4)
  9. CMU Database Systems - Concurrency Control Theory
  10. C均值聚类算法及其实现
  11. delphi madExcept使用指南
  12. c语言注释工具,C语言注释删除小工具下载
  13. 「超级右键」Mac上最强的右键菜单工具,让你效率飞起!
  14. PowerBI使用折线图分析异常数据
  15. 关于MATLAB调用第三方程序
  16. 红帽子linux中断C程序运行,在Linux中Expect – 中断程序 – Ctrl C.
  17. Spring Kafka:@KafkaListener 单条或批量处理消息
  18. 104 自定义大头针
  19. halcon第七讲:基于训练学习的颜色检测
  20. 记一次mysql启动失败问题.

热门文章

  1. 2021年中国DR设备市场竞争格局分析,未来DR市场将进入发展平台期「图」
  2. 千里马-modulo
  3. Android开发,你必须知道的四大天王。
  4. 阈值法matlab程序,遗传算法优化BP神经网络权值和阈值的通用MATLAB源码
  5. 计算机网络组件连接方式有,一种计算机网络信号连接装置的制作方法
  6. 测试透射晶格分析的软件,透射电镜(TEM)电子衍射在晶体结构分析中的应用
  7. 笔试 | 大疆2021秋招笔试题及题解
  8. jquery.validate.min.js 插件
  9. android 监测鼠标滑轮,android2.3 监控鼠标滑动事件
  10. Chosen by god【组合数打表】