梅森旋转(Mersenne twister)及其他随机数生成算法
Mersenne Twister这个名字来自周期长度通常取Mersenne质数这样一个事实。常见的有两个变种Mersenne Twister MT19937和Mersenne Twister MT19937-64。
Mersenne Twister算法的原理:Mersenne Twister算法是利用线性反馈移位寄存器(LFSR)产生随机数的,LFSR的反馈函数是寄存器中某些位的简单异或,这些位也称之为抽头序列。一个n位的LFSR能够在重复之前产生2^n-1位长的伪随机序列。只有具有一定抽头序列的LFSR才能通过所有2^n-1个内部状态,产生2^n - 1位长的伪随机序列,这个输出的序列就称之为m序列。为了使LFSR成为最大周期的LFSR,由抽头序列加上常数1形成的多项式必须是本原多项式。一个n阶本原多项式是不可约多项式,它能整除x^(2*n-1)+1而不能整除x^d+1,其中d能整除2^n-1。例如(32,7,5,3,2,1,0)是指本原多项式x^32+x^7+x^5+x^3+x^2+x+1,把它转化为最大周期LFSR就是在LFSR的第32,7,5,2,1位抽头。利用上述两种方法产生周期为m的伪随机序列后,只需要将产生的伪随机序列除以序列的周期,就可以得到(0,1)上均匀分布的伪随机序列了。
Mersenne Twister有以下优点:随机性好,在计算机上容易实现,占用内存较少(mt19937的C程式码执行仅需624个字的工作区域),与其它已使用的伪随机数发生器相比,产生随机数的速度快、周期长,可达到2^19937-1,且具有623维均匀分布的性质,对于一般的应用来说,足够大了,序列关联比较小,能通过很多随机性测试。
马特赛特旋转演算法产生一个伪随机数,一般为MtRand()。
- 应用范围:
Mersenne Twister 被以下软件用作默认 PRNG:
编程语言:Dyalog APL、IDL、R、Ruby、Free Pascal、PHP、Python (在NumPy中也可用,但默认改为PCG64从 1.17 版开始), Julia CMU Common Lisp , Embeddable Common Lisp , Steel Bank Common Lisp
Linux库和软件:GLib,GNU 多精度算术库,GNU Octave,GNU 科学库
其他:Microsoft Excel、GAUSS、gretl、Stata。SageMath , Scilab , Maple , MATLAB
它也可用于Apache Commons、标准C++库(自C++11起)中的Mathematica中。[33]许多程序库都提供了附加实现,包括Boost C++ 库、 CUDA 库和NAG 数值库。
Mersenne Twister 是SPSS中的两个 PRNG 之一:另一个生成器仅用于与旧程序兼容,并且 Mersenne Twister 被称为“更可靠”。Mersenne Twister 同样是SAS中的 PRNG 之一:其他生成器较旧且已弃用。Mersenne Twister 是Stata中的默认 PRNG ,另一个是KISS,用于与旧版本的 Stata 兼容。
- 主页
Mersenne Twister: A random number generator (since 1997/10)
http://www.math.sci.hiroshima-u.ac.jp/m-mat/MT/TINYMT/index.html#tiny
- 代码下载
目前最新版本为TinyMT(github)
其他还有MTGP
SFMT
- 替代品
PCG(github),
- 其他随机数产生器性能对比:
- 参考资料:
PCG, A Family of Better Random Number Generators | PCG, A Better Random Number Generator
https://en.wikipedia.org/wiki/Mersenne_Twister
控制随机数生成器 - MATLAB rng- MathWorks 中国
创建和控制随机数流- MATLAB & Simulink- MathWorks 中国
更换不推荐的 rand 和 randn 语法- MATLAB & Simulink- MathWorks 中国
梅森旋转(Mersenne twister)及其他随机数生成算法相关推荐
- JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)
今天主要是来研究梅森旋转算法,它是用来产生伪随机数的,实际上产生伪随机数的方法有很多种,比如线性同余法, 平方取中法等等.但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高质 ...
- C++:实现量化Mersenne twister梅森旋转算法测试实例
C++:实现量化Mersenne twister梅森旋转算法测试实例 #include "mersennetwister.hpp" #include "utilities ...
- 【随机数生成算法系列】线性同余法和梅森旋转法
一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数.通常我们程序里都是通过当前时间作为随机函数的第一个随机种子,然后 ...
- python求梅森尼数_谈谈梅森旋转:算法及其爆破
https://liam.page/https://liam.page/https://liam.page/ 现代编程语言,大都在标准库中包含了随机库.例如,C++ 在 C++11 标准中添加了 ra ...
- JAVA梅森旋转随机算法_梅森旋转算法
概念 梅森旋转算法(Mersenne twister),可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷. 常见的两种为基于32位的 MT19937和基于64位的 MT19937-64 ...
- MT19937(梅森旋转算法)
梅森旋转算法 定义:梅森旋转算法(Mersenne twister)是一个伪随机数发生算法.由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归.可以快速产生高质量的伪随机数,修正了 ...
- JAVA梅森旋转随机算法,C语言实现梅森旋转算法
原理: 梅森旋转算法是一种伪随机数生成算法 1.定义相关宏和结构体 #include #include #include #include typedef unsigned int uint; #de ...
- JAVA梅森旋转随机算法,你没听过的梅森旋转算法
(标准开头) 如果单独提梅森旋转算法可能大家都很陌生,但如果说到C++11的random可能大家就都熟悉多了.事实上,C++,python等多种计算机语言的随机数都是通过梅森旋转算法产生的.(也有一个 ...
- [NPUCTF2020]Mersenne twister
[NPUCTF2020]Mersenne twister 题目 cef4876036ee8b55aa59bca043725bf350a5e491debdef7ef7d63e9609a288ca1e2c ...
最新文章
- 第二版地面站加入"参数列表"
- Genome Biology:人体各部位微生物组时间序列分析
- android apk瘦身之 图片压缩 tinypng
- linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
- NEC学习 ---- 模块 - 带点文字链接列表
- 【时间统计】windows/linux 获取本地时间(精确到微妙)
- 坚决不要使用SQL逻辑删除本番环境的数据,降低程序风险
- python设置tk退出_Tkinter退出按钮
- python文本自动伪原创_自动写文章神器:6款在线Ai伪原创工具推荐。
- 教你写页游自动化Python脚本,取色,大漠识别和后台点击
- html如何修改按钮样式,css怎么设置按钮样式?
- kali rpm 安装方法_解决kali linux中无法使用RPM命令
- 神经网络BP反向传播算法原理和详细推导流程
- springboot+quartz定时任务
- 人工智能相关专利分析: 会比其他常见的计算机软硬件领域更难申请吗?
- 如何为macOS High Sierra创建可启动的USB安装程序
- Cobalt Strike 的 Beacon 使用介绍以及 Profile 文件修改Beacon内存教程
- 【Vue2.0学习】—数据绑定
- 获取系统当前时间----sqlServer
- selenium模拟登陆教务系统