随机数检测(二)

news2024/12/23 10:40:06

随机数检测(二)- 扑克检测、重叠子序列、游程总数、游程分布

    • 3.4 扑克检测方法
    • 3.5 重叠子序列检测方法
    • 3.6 游程总数检测
    • 3.7 游程分布检测

3.4 扑克检测方法

扑克检测方法如下图。
扑克检测方法

以下实现代码供参考。

def alterOffsetBit(m, offset, listSub:list):
    ret = []
    listSub[offset] = 0
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))

    listSub[offset] = 1
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))
    return ret
    

def seedSequence(m):
    sequencelist = [0]*m
    return alterOffsetBit(m, 0, sequencelist)

#get poker param, follow GM/T 0005-2021 appendix A
def getpokerM(len):
    if len < 20000:
        m = [2]
    else:
        m = [4, 8]
    return m    

def poker(epsilon:bitarray, m):
    seedList = seedSequence(m)
    listNi = [0]*(2**m)
    N = int(len(epsilon)/m)
    epsilonList = epsilon.tolist()
    for i in range(N):
        listNi[seedList.index(epsilonList[i*m:(i+1)*m:1])] += 1
    sum = 0
    for i in range(2**m):
        sum += listNi[i]**2
    V = (2**m)*sum/N - N
    pvalue = scipy.special.gammaincc((2**m - 1)/2, V/2)
    qvalue = pvalue
    return {'p':pvalue, 'q':qvalue}

3.5 重叠子序列检测方法

重叠子序列检测方法如下图。
重叠子序列
重叠子序列2
以下实现代码供参考。

#get serial param, follow GM/T 0005-2021 appendix A
def getserialM(len):
    if len < 20000:
        m = [2]
    elif len < 100000000:
        m = [3, 5]
    else:
        m = [3, 5, 7]
    return m    

def alterOffsetBit(m, offset, listSub:list):
    ret = []
    listSub[offset] = 0
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))

    listSub[offset] = 1
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))
    return ret
    

def seedSequence(m):
    sequencelist = [0]*m
    # print('sequencelist:' , sequencelist)
    return alterOffsetBit(m, 0, sequencelist)

def getV2(epsilonList:list, mlen):
    seedList = seedSequence(mlen)
    # print(seedList)
    V = [0] * (2**mlen)
    for i in range(len(epsilonList)-mlen+1):
        # print(epsilonList[i:i+mlen:1])
        seedindex = seedList.index(epsilonList[i:i+mlen:1])
        V[seedindex] += 1
    for i in range(len(V)):
        V[i] = V[i]**2
    return V
def calcPhym(epsilonlist:list, m):
    if m <= 0:#phy0 and phy-1 is 0
        return 0
    prefixM = epsilonlist[:m-1:1]

    n = len(epsilonlist)
    epsilonlist += prefixM

    Vm = getV2(epsilonlist, m)
    return (2**m)*sum(Vm)/n - n

def serial(epsilon:bitarray, m):

    # n = int(len(epsilon))
    epsilonList = epsilon.tolist()
    phym2 = calcPhym(epsilonList, m)
    phym_12 = calcPhym(epsilonList, m-1)
    phym_22 = calcPhym(epsilonList, m-2)

    deltaPhyM2 = phym2 - phym_12
    delta2PhyM2 = phym2 - 2*phym_12 + phym_22

    pvalue1 = scipy.special.gammaincc(2**(m-2), deltaPhyM2/2)
    pvalue2 = scipy.special.gammaincc(2**(m-3), delta2PhyM2/2)
    qvalue1 = pvalue1
    qvalue2 = pvalue2
    return {'p1':pvalue1, 'q1':qvalue1, 'p2':pvalue2, 'q2':qvalue2}

3.6 游程总数检测

游程总数检测方法如下图。
游程总数检测
游程总数检测2
以下实现代码供参考。

def runs(epsilon:bitarray):
    n = int(len(epsilon))
    epsilonList = epsilon.tolist()
    Vn = 1
    for i in range(int(len(epsilonList))-1):
        #r.append([1,0][epsilonList[i] == epsilonList[i+1]])
        if epsilonList[i] != epsilonList[i+1]:
            Vn += 1

    pi = sum(epsilonList)/n

    if abs(pi - 0.5) > (2.0 / sqrt(n)):
        pvalue = 0.0
        print('runs Test Failed : pvalue ', pvalue)
        return 1
    
    pvalue = math.erfc(abs(Vn-2*n*pi*(1-pi))/(2*sqrt(2*n)*pi*(1-pi)))
    qvalue = math.erfc((Vn-2*n*pi*(1-pi))/(2*sqrt(2*n)*pi*(1-pi)))/2
    return {'p':pvalue, 'q':qvalue}

3.7 游程分布检测

游程分布检测方法如下图。
游程分布
以下实现代码供参考。

def runsDistribution(epsilon:bitarray):

    n = int(len(epsilon))
    epsilonList = epsilon.tolist()
    e = []
    for i in range(1,int(len(epsilonList)+1)):
        e.append((n-i+3)/(2**(2+i)))
        if e[i-1] >= 5:
            k = i 
        else:
            break;

    gi = [0]*n
    bi = [0]*n
    runFlag = epsilonList[0]
    j = 1
    for i in range(1, n):
        if epsilonList[i] != runFlag:
            if runFlag == 0x00:
                gi[j - 1] += 1
            else:
                bi[j - 1] += 1
            runFlag = epsilonList[i]
            j = 1
        else:
            j += 1
    #GM/T 0005-2021 demands add all subfix to bk and gk
    bi[14] = sum(bi[14:len(bi)])
    gi[14] = sum(gi[14:len(gi)])
    #calc T
    T = 0
    for i in range(k):
        T += bi[i] + gi[i]
    #calc e'
    epie = [T/(2**(i+1)) for i in range(1, k+1)]
    epie[k-1] = T/(2**k)
    #calc V
    
    V1 = []
    V2 = []
    for i in range(k):
       V1.append(((bi[i] - epie[i])**2)/epie[i])
       #V1.append((bi[i] - e[i])**2/e[i])
    for i in range(k):
       V2.append(((gi[i] - epie[i])**2)/epie[i])
       #V2.append((gi[i] - e[i])**2/e[i])

    V = sum(V1) + sum(V2)
    pvalue = scipy.special.gammaincc(k-1, V/2)
    qvalue = pvalue
    return {'p':pvalue, 'q':qvalue}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HoloLens2与Unity的Socket通信踩坑日记

最近想让Hololens中获取电脑中更新的数据&#xff0c;打算使用套接字的方式进行通信&#xff0c;明明在unity中模拟测试可以进行正常通信&#xff0c;但是将软件部署到HoloLens上通信总是失败&#xff0c;找了很久的原因&#xff0c;找了很久的原因&#xff0c;终于能够正常通信…

国产自研开源大数据管理平台DataSophon

【背景】 几天在朋友圈看到开源社区Datavane发布了一个新开源项目DataSophon&#xff1b;一个致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助快速构建起稳定、高效、可弹性伸缩的大数据云原生平台&#xff1b;从介绍内容来看非常优秀&#xff…

事务管理-@TransActional

事务 概念&#xff1a;一组操作集合&#xff0c;是一个不可分割的单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 事务操作 开启事务&#xff08;一组操作开始前&#xff0c;开启事务&#xff09;&#xff1a;start transaction / begin;提交事务(操作全部成…

AutoSAR系列讲解(入门篇)4.8-BSW的OS功能

一、OS架构和术语解释 OS&#xff1a; 操作系统。就仅仅位于系统服务层&#xff0c;由于OS是需要直接操作硬件的一些功能的&#xff0c;所以系统服务层才会贯穿三层结构至达硬件。AutoSAR OS是基于OSEK OS开发出来的&#xff0c;OSEK也是早期ECU上的OS标准了&#xff0c;现在也…

matplotlib 区域填充

import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 8 * np.pi, 1000) siny np.sin(x) cosy np.cos(x / 2) / 2 plt.plot(x, siny, cskyblue, labelsin-X) plt.plot(x, cosy, corangered, label1/2 cos 1/2x )# 填充颜色 plt.fill_between(x, cosy, siny,…

TiDB 多租户方案和原理

作者&#xff1a; li_zhenhuan 原文来源&#xff1a; https://tidb.net/blog/a55c1d14 使用多租户 有很多文章介绍技术上如何使用多租户&#xff0c;在这里简单说明&#xff1a; CREATE RESOURCE GROUP rg_oltp RU_PER_SEC4000; ALTER USER app1 RESOURCE GROUP "r…

java——Collection、Map 深度理解

Collection <类型>&#x1f349; List(Conllection的实现类) 可以重复&#xff0c;有顺序 可存放多个null值&#x1f95d; ArrayList 主选 &#x1f353; 结构&#xff1a;数组 特点&#xff1a;查找快&#xff0c;增删慢 线程不安全&#xff0c;效率高 Vector&#…

第十三章 原理篇:SWIN-transformer

累了&#xff0c;没写完 面试完了再来写 参考教程&#xff1a; swin-transformer/model.py 文章目录 概述transformer blockswindow_partionW-MSAwindow-reversePatch Merging 概述 在前面介绍了vision transformer的原理&#xff0c;加入transformer的结构后&#xff0c;这种…

HCIP(HCIA回顾)

OSI/RM 七层 应用层 表示层 会话层 传输层 区分不同的流量&#xff0c;定义传输方式。 端口号由16位二进制构成&#xff0c;范围为0~65535(其中0不作为传输层的端口使用)&#xff0c;所以真实取值范围为1~65535&#xff1b;其中&#xff0c;1~1023称为知名端口号。 1、可靠…

React Native 集成到iOS原有的项目上

1.官方说明地址&#xff1a; 集成到现有原生应用 2. 主要步骤说明 把 React Native 组件集成到 iOS 应用中有如下几个主要步骤&#xff1a; 配置好 React Native 依赖和项目结构。了解你要集成的 React Native 组件。使用 CocoaPods&#xff0c;把这些组件以依赖的形式加入到项…

【推式子 二项式定理】Wannafly挑战赛 B

B-求值2_Wannafly挑战赛17 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e610; const int mxe2e510; const int Inf0x3f3f3f3f; const int mod998244353;int N;…

碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

sql统计某一字段不同状态的数量,时间戳转日期格式、按月统计使用

背景 1、在sql语句中统计一个字段的不同状态时&#xff0c;需要将每个状态的数量查出来&#xff0c;在进行统一输出&#xff0c;涉及表多次查询&#xff0c;下面用一个聚合函数的方式进行查询&#xff0c;比较方便&#xff0c;容易理解。 2、有时候数据表中的时间字段存储的是…

谈高考志愿填报

目录 不如先说说我自己。 一、选专业还是选学校&#xff1a; 二、你想推荐/避雷的专业&#xff1a; 三、填报志愿的策略&#xff1a; 四、影响专业选择的因素&#xff1a; 各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&…

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战&#xff08;27&#xff09;——追踪视频中的特征点 0. 前言1. 追踪视频中的特征点2. 特征点追踪原理3. 完整代码小结系列链接 0. 前言 我们已经知道可以通过一些最独特的点来分析图像&#xff0c;对于图像序列同样如此&#xff0c;其中一些特征点的运动可用于了解捕…

机器视觉之表面缺陷检测

曾有一个科研项目&#xff0c;青岛啤酒厂委托&#xff0c;研究啤酒瓶的质量检测。 一般这种玻璃瓶会有一定次品、不良品&#xff0c;特征是&#xff0c;内部细细的裂缝纹路长度长于一定限制&#xff0c;那么这种啤酒瓶在运输或者开瓶盖的过程中就有炸裂的风险。 所以&#xf…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

mysql数据(添加,修改,删除,单表查询)操作

插入&#xff1a; 主键自增&#xff08;第一列&#xff09;&#xff0c;可以写null&#xff0c;自动生成 最后一列是空值null&#xff0c;即不给分配 如果设置了默认值&#xff0c;如性别设置了默认值男&#xff0c;就可以写default 1、 查询起别名&#xff0c;如果别名有特…

操作数据库DDL、DML

DDL 1、创建表 create table tb_user(id int,username varchar(20),password varchar(10) ) 2、数据类型 3、删除表 drop table 表名 4、修改表 修改表名 alter table 表名 rename to 新表名 添加一列 alter table 表名 add 列名 数据类型修改数据类型 …

Vue中watch与computed区别

<body><div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/><br/>全名&#xff1a;&…