【转】梅森旋转(Mersenne twister)及其他随机数生成算法

原文链接:https://blog.csdn.net/qq_32515081/article/details/124071703

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 中国
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小金子的夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值