每日一程-10.五种基本随机数测试-续
生活随笔
收集整理的這篇文章主要介紹了
每日一程-10.五种基本随机数测试-续
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Author: Notus(hehe_xiao@qq.com)
Create: 2019-02-17
Update: 2019-02-17
隨機數(shù)測試-續(xù):Frequencey test(monobit test), Serial test(two-bit test), Poker test and Runs test
環(huán)境
Python version: 3.7.1
代碼如下(PseudorandomTest.py)
'''Pseudorandom Sequences Tests: 1. Frequency test (monobit test)2. Serial test (two-bit test)3. Poker test4. Runs test5. Autocorrelation test@Author: Notus(hehe_xiao@qq.com)@Create: 2019-02-15@Update: 2019-02-17 '''# 1. Frequency test(monobit test) def monobitTest(num):n = len(num)n0 = num.count('0')n1 = num.count('1')X = (n0 - n1) ** 2 / nreturn 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 = 0for i in range(0, n-1):i0 = num[i]i1 = num[i+1]if i0 == '0':if i1 == '0': n00 += 1else: n01 += 1else:if i1 == '0': n10 += 1else: n11 += 1i += 1X = 4 * (n00**2 + n01**2 + n10**2 + n11**2) / (n-1) - 2 * (n0**2 + n1**2) / n + 1return n, n00, n01, n10, n11, X # 3. Poker test def pokerTest(num, m):n = len(num)k = n // mif k < 5 * (2 ** m):raise ValueError("Error: the value of m is invalid for Poker Test!")# ni count list, 0 <= i <= 2**m - 1ni_list = [0] * (2 ** m)# counting for b in range(0, n-m, m):index = 0for c in range(m):index = index * 2 + int(num[b + c])ni_list[index] += 1s = 0for i in range(1, 2**m + 1):s += ni_list[i - 1] ** 2X = (2 ** m) * s / k - kreturn 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_ik = max(e.keys())B = [0] * kG = [0] * kdef countBG(bit, runLength):counts = 0contNumbs = 0 # continuous number countsfor idx in range(n):if num[idx] != bit: if contNumbs == runLength:counts += 1contNumbs = 0continuecontNumbs += 1# last block or gapif contNumbs == runLength and idx == n - 1: counts += 1 return countsfor i in range(k):B[i] = countBG('1', i + 1)G[i] = countBG('0', i + 1)x1 = x2 = 0for 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 + x2return e, k, B, G, X# 5. Autocorrelation test # Todoif __name__ == '__main__':num = ('11100' + '01100' + '01000' + '10100' + '11101' + '11100' + '10010' + '01001') * 4x1 = 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))try:x3 = pokerTest(num, 3)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 = {}".format(*x4))運行結(jié)果
python PseudorandomTest.py frequency test: n = 160, n0 = 84, n1 = 76, X1 = 0.4serial test: n = 160, n00 = 44, n01 = 40, n10 = 40, n11 = 35, X2 = 0.6251572327043959poker test: k = 53, ni_list = [5, 10, 6, 4, 12, 3, 6, 7] X3 = 9.641509433962263runs test: e = {1: 20.25, 2: 10.0625, 3: 5.0}, k = 3, B = [25, 4, 5], G = [8, 20, 12] X4 = 31.791306264856992轉(zhuǎn)載于:https://www.cnblogs.com/leo1875/p/10389966.html
總結(jié)
以上是生活随笔為你收集整理的每日一程-10.五种基本随机数测试-续的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工行换卡不换号怎么激活
- 下一篇: copy elison RVO NR