每日一程-11.五种基本随机数测试-完结
发布时间:2020-12-14 04:24:05 所属栏目:大数据 来源:网络整理
导读:Author: Notus([email?protected]) Create: 2019-02-18 Update: 2019-02-18 随机数测试:Frequencey test(monobit test),Serial test(two-bit test),Poker test,Runs test and Autocorrelation test 环境 Python version: 3.7.1 代码如下(PseudorandomTest.p
随机数测试:Frequencey test(monobit test),Serial test(two-bit test),Poker test,Runs test and Autocorrelation test环境
代码如下(PseudorandomTest.py)‘‘‘ Pseudorandom Sequences Tests: 1. Frequency test (monobit test) 2. Serial test (two-bit test) 3. Poker test 4. Runs test 5. Autocorrelation test @Author: Notus([email?protected]) @Create: 2019-02-15 @Update: 2019-02-18 @Version: 1.0 ‘‘‘ import math # 1. Frequency test(monobit test) def monobitTest(num): n = len(num) n0 = num.count(‘0‘) n1 = num.count(‘1‘) X = (n0 - n1) ** 2 / n return n,n0,n1,X # 2. Serial test(two-bit test) def serialTest(num): n = len(num) n0 = num.count(‘0‘) n1 = num.count(‘1‘) n00 = n01 = n10 = n11 = 0 for i in range(0,n-1): i0 = num[i] i1 = num[i+1] if i0 == ‘0‘: if i1 == ‘0‘: n00 += 1 else: n01 += 1 else: if i1 == ‘0‘: n10 += 1 else: n11 += 1 i += 1 X = 4 * (n00**2 + n01**2 + n10**2 + n11**2) / (n-1) - 2 * (n0**2 + n1**2) / n + 1 return n,n00,n01,n10,n11,X # 3. Poker test def pokerTest(num,m): n = len(num) k = n // m if k < 5 * (2 ** m): raise ValueError("Error: the value of m is invalid for Poker Test!") # ni count list,0 <= i <= 2**m - 1 ni_list = [0] * (2 ** m) # counting for b in range(0,n-m,m): index = 0 for c in range(m): index = index * 2 + int(num[b + c]) ni_list[index] += 1 s = 0 for i in range(1,2**m + 1): s += ni_list[i - 1] ** 2 X = (2 ** m) * s / k - k return k,ni_list,X # 4. Runs test def runsTest(num): n = len(num) e = {} for i in range(1,n + 3): e_i = (n - i + 3) / (2 ** (i + 2)) if e_i >= 5: e[i] = e_i k = max(e.keys()) B = [0] * k G = [0] * k def countBG(bit,runLength): counts = 0 contNumbs = 0 # continuous number counts for idx in range(n): if num[idx] != bit: if contNumbs == runLength: counts += 1 contNumbs = 0 continue contNumbs += 1 # last block or gap if contNumbs == runLength and idx == n - 1: counts += 1 return counts for i in range(k): B[i] = countBG(‘1‘,i + 1) G[i] = countBG(‘0‘,i + 1) x1 = x2 = 0 for i in range(1,k + 1): x1 += (B[i-1] - e[i]) ** 2 / e[i] x2 += (G[i-1] - e[i]) ** 2 / e[i] X = x1 + x2 return e,k,B,G,X # 5. Autocorrelation test def autocorrelationTest(num,d): n = len(num) if not 1 <= d <= math.floor(n / 2): raise ValueError("Error: d value is invalid!") Ad = 0 for i in range(n - d): Ad += ( int(num[i]) ^ int(num[i + d]) ) X = 2 * (Ad - (n - d) / 2) / math.sqrt(n - d) return Ad,X if __name__ == ‘__main__‘: num = (‘11100‘ + ‘01100‘ + ‘01000‘ + ‘10100‘ + ‘11101‘ + ‘11100‘ + ‘10010‘ + ‘01001‘) * 4 x1 = monobitTest(num) print("frequency test: nn = {},n0 = {},n1 = {},nX1 = {}n".format(*x1)) x2 = serialTest(num) print("serial test: nn = {},n00 = {},n01 = {},n10 = {},n11 = {},nX2 = {}n".format(*x2)) m = 3 try: x3 = pokerTest(num,m) except ValueError as err: print(err.args[0]) sys.exit() print("poker test: nk = {},ni_list = {} nX3 = {}n".format(*x3)) x4 = runsTest(num) print("runs test: ne = {},k = {},B = {},G = {} nX4 = {}n".format(*x4)) d = 8 try: x5 = autocorrelationTest(num,d) except ValueError as err: print(err.args[0]) sys.exit() print("Autorcorrelation test: nA({}) = {} nX5 = {}".format(d,*x5)) 运行结果python PseudorandomTest.py frequency test: n = 160,n0 = 84,n1 = 76,X1 = 0.4 serial test: n = 160,n00 = 44,n01 = 40,n10 = 40,n11 = 35,X2 = 0.6251572327043959 poker test: k = 53,ni_list = [5,10,6,4,12,3,7] X3 = 9.641509433962263 runs test: e = {1: 20.25,2: 10.0625,3: 5.0},k = 3,B = [25,5],G = [8,20,12] X4 = 31.791306264856992 Autorcorrelation test: A(8) = 100 X5 = 3.893314107138301 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |