今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法,

平方取中法等等。但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质量的伪随

机数,并且效率高效,弥补了传统伪随机数生成器的不足。梅森旋转算法的最长周期取自一个梅森素数,

由此命名为梅森旋转算法。常见的两种为基于32位的MT19937-32和基于64位的MT19937-64。

由于梅森旋转算法是利用线性反馈移位寄存器(LFSR)产生随机数的,所以我们先来认识线性反馈移位寄存器。

首先,移位寄存器包括两个部分

(1)级,每一级包含一个比特,比如11010110是一个8级的移位寄存器产生的

(2)反馈函数,线性反馈移位寄存器的反馈函数是线性的,非线性反馈移位寄存器的反馈函数是非线性的

一个级的移位寄存器产生的序列的最大周期为,当然这个最大周期跟反馈函数有很大关系,线性反馈函数实

际上就是这个级的移位寄存器选取“某些位”进行异或后得到的结果,这里的“某些位”的选取很重要,得到线性反馈

函数之后,把这个移位寄存器的每次向右移动一位,把最右端的作为输出,把“某些位”的异或结果作为输入放到最左

端的那位,这样所有的输出对应一个序列,这个序列叫做M序列,是最长线性移位寄存器序列的简称。

上面“某些位”的选取问题还没有解决,那么应该选取哪些位来进行异或才能保证最长周期为,这是一个很重要

的问题。选取的“某些位”构成的序列叫做抽头序列,理论表明,要使LFSR得到最长的周期,这个抽头序列构成的多项

式加1必须是一个本原多项式,也就是说这个多项式不可约,比如。

下面以一个4位的线性反馈移位寄存器为例说明它的工作原理。

如果的值分别是1 0 0 0,反馈函数选取,那么得到如下序列

可以看出周长为15。在这一个周期里面涵盖了开区间内的所有整数,并且都是没有固定顺序出现的,有

很好的随机性。

之前说过,梅森旋转算法的周期为,那么说明它是一个19937级的线性反馈移位寄存器,实际上基于32位

的MT19937-32只需要用到32位,那么为什么要选择周长为的算法呢? 那是因为这样做随机性很好。

梅森旋转算法是基于线性反馈移位寄存器的一直进行移位旋转,周期为一个梅森素数,果然是名副其实。

梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士[1]在1997年开发,基于有限二进制字段上的矩阵线性递归。可以快速产生高质量的伪随机数, 修正了古典随机数发生算法的很多缺陷。

梅森旋转算法是R,Python,Ruby,IDL,Free Pascal,PHP,Maple,Matlab,GMP和GSL的默认伪随机数产生器。从C++11开始,C++也可以使用这种算法。在Boost C++,Glib和NAG数值库中,作为插件提供。 在SPSS中,梅森选旋转算法是两个PRNG中的一个:另一个是产生器仅仅为保证旧程序的兼容性,梅森旋转被描述为”更加可靠“。梅森旋转在SAS中同样是PRNG中的一个,另一个产生器是旧时的且已经被弃用。

最为广泛使用Mersenne Twister的一种变体是MT19937,可以产生32位整数序列。具有以下的优点:

有219937 − 1的非常长的周期。在许多软件包中的短周期—232 随机数产生器在一个长周期中不能保证生成随机数的质量。[2

在1 ≤ k ≤ 623的维度之间都可以均等分布(参见定义).

除了在统计学意义上的不正确的随机数生成器以外, 在所有伪随机数生成器法中是最快的(当时)

算法详细

本算法基于标准(线性)旋转反馈移位寄存器(twisted generalised feedback shift register/TGFSR)产生随机数

算法中用到的变量如下所示:

·w:长度(以bit为单位)

·n:递归长度

·m:周期参数,用作第三阶段的偏移量

·r:低位掩码/低位要提取的位数

·a:旋转矩阵的参数

·f:初始化梅森旋转链所需参数

·b,c:TGFSR的掩码

·s,t:TGFSR的位移量

·u,d,l:额外梅森旋转所需的掩码和位移量

MT19937-32的参数列表如下:

·(w, n, m, r) = (32, 624, 397, 31)

·a = 9908B0DF(16)

·f = 1812433253

·(u, d) = (11, FFFFFFFF16)

·(s, b) = (7, 9D2C568016)

·(t, c) = (15, EFC6000016)

·l = 18

MT19937-64的参数列表如下:

·(w, n, m, r) = (64, 312, 156, 31)

·a = B5026F5AA96619E9(16)

·f = 6364136223846793005

·(u, d) = (29, 555555555555555516)

·(s, b) = (17, 71D67FFFEDA6000016)

·(t, c) = (37, FFF7EEE00000000016)

·l = 43

参考链接:

https://github.com/xuwei-k/tinymt

https://en.wikipedia.org/wiki/Mersenne_Twister#TinyMT

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/JAVA/index.html

https://cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java

https://cs.gmu.edu/~sean/research/mersenne/MersenneTwisterFast.java

http://commons.apache.org/proper/commons-rng/

JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)相关推荐

  1. 一个伪随机数生成算法

    一个伪随机数生成算法 这几天逛程序员论坛,发现了不少好帖子,增长了不少知识,现拿其中一则为例说明. 某人提出一个问题,说怎么样能生成一亿个不重复的随机数呢? 问题表述起来很简单,似乎只要弄明白什么叫随 ...

  2. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  3. 图形算法:圆形生成算法

    图形算法:圆形生成算法 标签(空格分隔): 算法 版本:2 作者:陈小默 声明:禁止商用,禁止转载 发布于:作业部落.CSDN博客 圆的定义为所有距离中心位置 (xc,yc) 为定值 r 的点的集合1 ...

  4. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  5. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  6. prim算法_自动生成随机迷宫(1)prim算法

          "程序 = 数据  + 算法",一款好的作品不单单是代码的堆砌,还有其灵魂的部分,那就是算法:算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  7. java实现一个随机迷宫_【小白学游戏常用算法】一、随机迷宫算法

    现在的很多游戏中的地图一般采用格子的方式,虽然在表面地图上无法看到实际的格子,但是在地图的结构中专门有一个逻辑层,这个层和地图大小相等,划出很多小的格子,然后在可以通过的地方使用0表示,在有障碍的且不 ...

  8. 分享一种高效伪随机数生成算法

    我们知道C语言提供了随机数生成,另外Qt也提供了随机数的生成. 比如C语言,生成0-19随机数,如下: srand(time(nullptr)); // 从1970-01-01 00:00:00到现在 ...

  9. java红包金额随机数算法_实时随机数算法(微信红包分配算法)

    微信红包算法在知乎上面有个专题讨论,其实红包的发放的随机算法,有两种作法:java 一.预生产: 算法 无外乎是在发红包的时候,随机去把金额生成到某个容器当中,而后要用的时候,一个一个的POP:微信 ...

最新文章

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
  2. 指针小白:修改*p与p会对相应的地址的变量产生什么影响?各个变量指针的长度为多少?...
  3. correlation 蒙特卡洛_蒙特卡洛模拟法及其Matlab案例
  4. EasyDarwin开源社区 短视频拍摄项目Github地址
  5. csp2020 j2民间数据下载_华为麒麟 990 5G 下载速率领先
  6. python随机抽样numpy_python numpy之np.random的随机数函数使用介绍
  7. git reset --hard_Git紧急自救简易指南(二)——版本的游历
  8. 2021牛客暑期多校训练营4 H-Convolution(数学)
  9. Linux进程全解1——程序的开始、结束
  10. 【小白学云计算】xmpp开源服务器的配置和安装图文详解
  11. Oracle定时任务
  12. lsqnonneg函数_matlab中线性最小二乘问题求解
  13. Android 轻松实现仿淘宝地区选择
  14. flask接口mysql开发例子,使用Flask开发简单接口3–引入MySQL
  15. 【自考总结】寒冬里的温暖
  16. 阿里乌镇大动作:平头哥开源 MCU 设计平台!
  17. 老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
  18. 百度浏览器的编程html,百度来路浏览器劫持代码(替换浏览器正在浏览页面)...
  19. 积木式移动互联网App Hybrid框架-modular
  20. 七种PDF转Excel的转换方法,分分钟提高你的工作效率

热门文章

  1. 如何将JPG图片转换成WEBP格式
  2. AutoDesk CAD如何彻底卸载/不影响二次安装
  3. 奥利给!2020年10月程序员工资最新统计,涨了!!!
  4. VisualC++开发GIS系统
  5. 转发和重定向的区别以及适用范围
  6. Android开发调试神器——Stetho介绍
  7. Notify 与 Indicate的区别
  8. C++ 11 14 RAII经典用法
  9. 给Flutter中的Widget设置透明度
  10. php网页爬虫-简单的类