伪随机数生成算法

本文介绍了伪随机数生成算法的重要性及其在计算机科学领域的应用,如游戏、数据科学和密码学。讨论了线性同余法和马特赛特旋转演算法,包括它们的工作原理、优缺点及在统计学上的检验。线性同余法因参数选择不当可能导致序列不随机,而马特赛特旋转演算法则因其高质量和广泛验证成为常用的选择。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

写在前面

伪随机数生成算法在计算机科学领域应用广泛,比如枪击游戏里子弹命中扰动、数据科学里对样本进行随机采样、密码设计、仿真领域等等,背后都会用到伪随机数生成算法。

骰子

说随机,那什么是随机呢?随机意味着不可预测,没有任何规律。谈随机数,一定是在序列当中,单拿出一个数谈随机是没有意义的。给一个数字序列,如果能在其中发现规律可以预测或以一定概率(大于“猜”的概率)预测接下来的数,那么这个序列就不是随机的。

在20世纪早期科学工作中就开始需要使用随机数,为了获取随机数,研究人员通过物理方式采集了成千上万的随机数,并发布给他人使用,比如RAND公司在1955年发布的《A Million Random Digits with 100,000 Normal Deviates》(百万乱数表)——亚马逊美国现在还有卖~。但是,通过物理方式采集“真”随机数并不高效,实时获取需要附加额外的随机数发生装置,而且获取速度缓慢、序列不可复现,如果将采集到随机数全保存下来则需要占用额外的存储空间,而且数量终究是有限的,于是大家开始寻求生成“伪”随机数的数学方法。伪随机数,顾名思义,即看起来是随机的但实际上不是,在不知其背后生成方式的情况下,生成的序列看上去毫无规律可言。

本文源自个人兴趣通过查阅参考文献整理所得,再加上个人的理解,大部分图片来自WIKI。

统计学检验

如何判断一个序列是否够随机呢?伪随机数生成算法多种多样,总要分出个孰好孰差,如何对各自的随机性进行定量评估呢?主要有两类方式,其出发点都是试图定量评估序列中是否隐含某种规律或模式

  • 实证检验。给定一个随机序列而不告知其背后的生成方式,尝试对观测到的分布进行拟合,以预测后面的序列,或者查看其中是否具有某些统计规律,比如查看分布是否均匀、连续值的相关性、某些数出现位置的间隔分布是否有规律等等。具体有 χ 2 \chi ^2 χ2检验KS检验、Frequency test、Serial test等等。

  • 理论检验。直接分析生成器的理论性质(已知生成方式),生成器通常需要配置一些参数,不同的参数会影响生成序列的质量,比如考察不同参数对随机序列周期的影响。

可在下一小节对理论检验一窥一二,但本文的重点不在于此,就不详细展开了,详细内容可见参考资料。

线性同余法

lin­ear con­gru­en­tial generator(LCG)线性同余法是最早最知名的伪随机数生成算法之一,曾被广泛应用,后逐渐被更优秀的算法替代,其通过如下递推关系定义:

X n + 1 = ( a X n + c )   m o d   m X_{n+1} = (aX_n + c)\ mod \ m Xn+1=(aXn+c) mod m

其中, X X X为伪随机序列,

  • m m m m > 0 m > 0 m>0,模数,显然其也是生成序列的最大周期
  • a a a 0 &lt; a &lt; m 0 &lt; a &lt; m 0<a<m,乘数
  • c c c 0 ≤ c &lt; m 0 \leq c &lt; m 0c<m,增量
  • X 0 X_0 X0 0 ≤ X 0 &lt; m 0 \leq X_0 &lt; m 0X0<m,种子点(起始值)

c = 0 c = 0 c=0时,被称为multiplicative congruential generator (MCG),如果 c ≠ 0 c \neq 0 c̸=0,被称为mixed congruential generator。

线性同余法的参数应该被小心选取,否则生成的序列将非常糟糕,比如当 a = 11 , c = 0 , m = 8 , X 0 = 1 a = 11, c = 0, m = 8, X_0=1 a=11,c=0,m=8,X0=1时,得到的序列是 3、1、3、1、3……从1960s开始使用IBM的RANDU算法,参数设置为 a = 65539 , c = 0 , m = 2 31 a = 65539, c = 0, m = 2^{31} a=65539,c=0,m=231,最终也被证明是糟糕的设计,因为 65539 = 2 16 + 3 65539 = 2 ^{16} + 3 65539=216+3,可进一步推导得

X n + 2 = ( 2 16 + 3 ) X n + 1 = ( 2 16 + 3 ) 2 X n = [ 6 ( 2 16 + 3 ) − 9 ] X n = 6 X n + 1 − 9 X n X_{n+2} = (2^{16} + 3)X_{n+1} = (2^{16} + 3)^2 X_n = [6(2^{16} + 3) - 9]X_n=6X_{n+1}-9X_n Xn+2=(216+3)Xn+1=(216+3)2Xn=[6(216+3)9]Xn=6Xn+19Xn

因为相邻3个数间存在这样的相关性,若将相邻3个数作为坐标绘制在3维坐标系里,会得到15个明显的平面

RANDU

可见,获得的序列并不是那么随机,而且没有均匀地填充整个空间。线性同余法的参数很重要,一些平台和运行时库中采用的参数如下

Parameters in common use

使用递推关系的方式带来了可复现的便利——只需要记住种子点就可以复现整个序列,而不需要去存储整个序列,但是带来的弊端就是相邻点之间的相关性,随意设置参数(像RANDU)可能让序列直落在几个稀疏的平面上,通常需要将 m m m选取的足够大,同时避开2的整数次幂。

马特赛特旋转演算法

Mersenne Twister 马特赛特旋转演算法,是1997年提出的伪随机数生成算法,其修复了以往随机数生成算法的诸多缺陷,可快速生成高质量的伪随机数,且经过了广泛的统计学检验,目前在各种编程语言和库中已普遍存在或作为默认的伪随机数发生器,被认为是更可靠的伪随机数发生器。下图截自python的官方文档:

Python random

Mersenne Twister生成随机数的过程比线性同余法要复杂得多,图示化如下:

Mersenne Twister

主要流程有3步是:

  1. 初始化 n n n个状态:根据给定的种子点 x 0 x_0 x0,通过移位、异或、乘法、加法等操作生成后续的 n − 1 n-1 n1个状态 x 1 x_1 x1 x n − 1 x_{n-1} xn1,bit位数为 w w w
  2. 生成伪随机数:根据当前状态,通过移位、与、异或操作生成随机数
  3. 更新 n n n个状态:每生成 n n n个随机数后,在生成下一个随机数前,更新状态

具体参见伪代码(来自WIKI),如下:

// Create a length n array to store the state of the generator
int[0..n-1] MT
int index := n+1
const int lower_mask = (1 << r) - 1 // That is, the binary number of r 1's
const int upper_mask = lowest w bits of (not lower_mask)

// Initialize the generator from a seed
function seed_mt(int seed) {
    index := n
    MT[0] := seed
    for i from 1 to (n - 1) { // loop over each element
        MT[i] := lowest w bits of (f * (MT[i-1] xor (MT[i-1] >> (w-2))) + i)
    }
}

// Extract a tempered value based on MT[index]
// calling twist() every n numbers
function extract_number() {
    if index >= n {
        if index > n {
          error "Generator was never seeded"
          // Alternatively, seed with constant value; 5489 is used in reference C code
        }
        twist()
    }

    int y := MT[index]
    y := y xor ((y >> u) and d)
    y := y xor ((y << s) and b)
    y := y xor ((y << t) and c)
    y := y xor (y >> l)

    index := index + 1
    return lowest w bits of (y)
}

// Generate the next n values from the series x_i 
function twist() {
    for i from 0 to (n-1) {
        int x := (MT[i] and upper_mask)
                  + (MT[(i+1) mod n] and lower_mask)
        int xA := x >> 1
        if (x mod 2) != 0 { // lowest bit of x is 1
            xA := xA xor a
        }
        MT[i] := MT[(i + m) mod n] xor xA
    }
    index := 0
}

标准实现32bit版本称之为MT19937,参数设置如下:

  • ( w , n , m , r ) = ( 32 , 624 , 397 , 31 ) (w, n, m, r) = (32, 624, 397, 31) (w,n,m,r)=(32,624,397,31)
  • a = 9908 B 0 D F 16 a = \rm 9908B0DF_{16} a=9908B0DF16
  • ( u , d ) = ( 11 , F F F F F F F F 16 ) (u, d) = (11, \rm FFFFFFFF_{16}) (u,d)=(11,FFFFFFFF16)
  • ( s , b ) = ( 7 , 9 D 2 C 568 0 16 ) (s, b) = (7, \rm 9D2C5680_{16}) (s,b)=(7,9D2C568016)
  • ( t , c ) = ( 15 , E F C 6000 0 16 ) (t, c) = (15, \rm EFC60000_{16}) (t,c)=(15,EFC6000016)
  • l = 18 l = 18 l=18

后记

伪随机数生成算法有很多,远不止本文介绍的两种,还有middle-square method(1946)、Additive Congruential Method、xorshift(2003)WELL(2006,对Mersenne Twister的改进)等等,本文只是从中选取具有代表性的两种,可阅读参考文献了解更多。

参考

本文出自本人博客:伪随机数生成算法

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

内容概要:本文档围绕“光伏并网逆变器序阻抗建模、扫频辨识与弱电网交互稳定性分析”展开,提供基于Matlab和Simulink的完整代码与仿真模型,复现了相关博士论文的核心研究成果。内容聚焦于新能源发电系统接入弱电网时的稳定性问题,系统阐述了光伏逆变器的正负序阻抗建模方法、小信号扫频辨识技术、锁相环与电流环的动态耦合效应、LCL滤波器的作用机制以及系统宽频带振荡的失稳机理。通过构建精确的序阻抗模型并结合扫频法进行稳定性判据分析,深入揭示并网逆变器与弱电网间的交互特性,为实际工程中振荡问题的预测、诊断与抑制提供坚实的理论支撑与有效的技术路径。; 适合人群:具备电力电子、自动控制理论及新能源发电系统基础知识,正在从事相关领域研究的硕士/博士研究生、高校科研人员以及电力系统行业的工程师。; 使用场景及目标:①复现并验证博士论文中关于光伏逆变器序阻抗建模与弱电网交互稳定性的关键结论;②作为科研项目或学位论文的技术蓝本,开展弱电网环境下并网系统稳定性仿真与机理研究;③深入掌握Matlab/Simulink在电力系统小信号稳定性分析、特别是阻抗建模与扫频法应用方面的高级仿真技能。; 阅读建议:学习者应结合所提供的Matlab代码与Simulink仿真模型,亲手运行并调试扫频辨识程序,细致分析序阻抗建模的每一步推导与实现过程,重点关注锁相环动态特性对系统稳定裕度的影响,通过调整控制器参数与电网强度观察系统响应变化,从而深刻理解交互失稳的内在机理,实现从理论到实践的融会贯通。
内容概要:本文介绍了如何利用有限元分析获得的磁通链接图来建立永磁同步电机(PMSM)的高精度数学模型,并在Simulink环境中实现仿真。该方法通过精确捕捉电机内部复杂的磁场分布,克服传统建模中因理想化假设导致的精度不足问题,从而显著提升模型的真实性与可靠性。文中系统阐述了从有限元仿真数据提取、磁链特性曲线拟合到导入Simulink构建动态仿真模型的完整流程,重点强调了数据处理的关键步骤与模型参数的映射关系,为高性能电机控制算法的设计、验证与优化提供了高保真的仿真平台。; 适合人群:具备电机学、电磁场理论基础及Simulink/MATLAB仿真能力的高校研究生、科研院所研究人员以及从事电机控制与电力电子系统开发的工程技术专家。; 使用场景及目标:①用于高校和科研机构开展先进PMSM控制策略(如FOC、MPC)的研究与教学实验;②服务于工业界对高精度电机数字孪生模型的需求,支持新型电机驱动系统的快速原型开发与性能测试;③帮助研究人员深入探究PMSM的非线性特性(如饱和、交叉耦合)及其对系统动态性能的影响。; 阅读建议:建议读者结合具体的电机设计参数与应用场景,严格按照文中所述的数据处理与建模流程进行实践操作,特别注意有限元软件与Simulink之间的数据接口规范与单位一致性,确保物理信息的无损转换。同时,可进一步通过实验数据对仿真模型进行校准与验证,以评估其在不同工况下的准确性与鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值