什么是Mersenne Twister(翻译中...)

来源:互联网 发布:淘宝c店品牌授权怎么弄 编辑:程序博客网 时间:2024/05/03 16:57

 翻译:zhengdy | 2010-04-02 | 原文


什么是Mersenne Twister

 

Mersenne Twister (以下简称为MT)是由Makoto Matsumoto(松本真) 和Takuji Nishimura(西村拓士) 在1996年至1997年之间开发的伪随机数生成算法。(在2002年1月改进了初始化例程。)MT具有以下的优点:

  • 是在考虑了现存的各种生成法的缺点的基础上设计的。
  • 程序用C语言实现,可以从这个主页上下载。
  • 具有前所未有的长周期,高维度的均等分布的特性。(已被证明具有在周期219937 − 1,623个维度之间均等分布的特性。)
  • 生成速度快。(虽然取决于处理系统,在有流水线和缓存的系统上,有时比C标准库的rand()还快。另外在当时(1997年)比cokus版的rand()会快4倍,但是在ANSI- C的rand()从LCG法改为lagged-fibonacci之后速度就相差无几了。)
  • 空间效率高。(为32位以上的机器设计的mt19937.c仅需624个字的工作区域。 一个字长为32bit。)

 


请求和谢词

 


请求

 

MT是自由软件。请大家随便使用。在使用的时候如果如果您能把使用MT的目的,过程和适当的参考发到m-mat@math.sci.hiroshima-u.ac.jp的话将非常令我欢欣鼓舞。最后也给我您的链接。

 

如果您有关于MT的相关联的改良,问题或是应用(例如:C以外语言的实现,汇编语言的高速实现, 非均匀的随机分布等)之类的好东东的话,并允许在这个主页上链接的话。请告诉我。

 

MT是基于在大约150年到50年前研究过的,在当时无法预料到会有用武之地的纯抽象数学特别是古典数论的算法。在近年,对于纯数学有非常大的非议,甚至在大学也往往关闭数学系,改为其他应用学科。从长远来看,我觉的这是不好的。纯数学一直在意想不到的取得重大成果,希望大家记住这一点。


謝辞

 

关于用在MT的想法之一的Twisting是和1996年4月逝去的米田信夫(Prof. Nobuo Yoneda)教授共同讨论的结果。谨以此论文献给他。

 

MT的前身,Twisted GFSR(Generalized Feedback Shift Register)是松本和栗田良春教授的共同研究的成果。

 

MT是东京大学的伏見正則(M. Fushimi), IBM东京基础研究所(IBM Tokyo Research Laboratory)的手塚集(Shu. Tezuka),蒙特利尔大学P. Lecuyer和 R. Couture,澳大利亚科学院(Austrian Academy of Sciences)的 H.Niederreiter们的研究成果的延伸,MT极其依赖于他们的研究。

 

MT的研究得益于庆应大学数理学科以及以下的其他机构的协力。京都大学数理解析研究所,蒙特利尔大学的CRM,德国(莱比锡)马普数学研究所Max-Planck-Institute for Mathematics,奥地利的萨尔茨堡大学(Salzburg University) 等等。

 

MT使用了之前为止发表的许许多多想法。特别感谢以下人士的建议和协助:
N. Yoneda, P. L'Ecuyer, R. Couture, H. Niederreiter, P. Hellekalek, M. Fushimi, S. Tezuka, Y. Kurita, D. Knuth, H. Leeb, S. Wegenkittl, T. Cooper, M. Rieffel, H. Enomoto, 以及其他许许多多给了我们宝贵意见的人们,包括TT800用户们, twisted generator的前身。


名称的由来

MT最初的名称是”Primitive Twisted Generalized Feedback Shift Register Sequence“(根据历史的理由)
--------------------------------------------------------------------------------

 

松本真   :高德纳来信说这名字太绕口了
西村拓士:......。


几天后
松本真   :喂, Mersenne Twister这个名字如何, 用的是梅森素数,又可以表现它前身是Twisted GFSR。
西村拓士:嗬。

松本真   :像过山车一样快,而且好记又好叫。而且是秘密哦, 这隐藏着创始人姓名的首字母 。
西村拓士:......
松本真   :就叫它MT吧,MT
西村拓士:嗯,这也不错。


日后,高德纳来信说“这名字听起来不错的。“:-)

 



MT好在什么地方?


  • 数学上的理由


在这里,我们不想深入的详细去讨论。如需详细资料, 请参考预印本的mt.ps. 简要地说, MT设计为按照实际条件来满足现代研究的需要。 我们现在还没有一个关于"好的伪随机数" 的定义,所以,对于MT,在数学上没有严格保证说它完全没有缺陷。

 

不过,普遍认为光谱测试(spectral test)是一个选择好的随机数产生器的最强的测试。MT旨在通过一个类似的测试, 称为K -分布测试。举个例子,如果 我们期待32位精度的输出, 那么对于623维的单位立方体的所有周期来说输出的623个元组应该是均等分布的。对于16位精度,1246维的1246个元组也是均等分布,对于2位精度有9968维。这些值 至少比之前的记录大15倍。 MT通过了许多严厉的测试,包括由G.Marsaglia做的diehard test和P.Hellekalek and S.Wegenkittl 做的负载测试。

 

MT是从一个非常成功的发生器TT800改良来的, 有着2^800-1 的周期,并且在最近几年获得我许多用户的好评 . MT 更加健壮。

 

这个发生器被实现利用最快的算术操作来生成输出,不用除法,也不用乘法。 在同一时间内生成一个数组, 充分利用了缓存和流水线处理的优点。


  • 其他研究者的评价

"在这一期中有两篇重要的论文, 在第一篇文章中, 松本和西村提出了一类基于线性模2循环的(乱数)发生器。这些发生器非常快,有着极长的周期,并且非常健壮。他们提供了周期为2 ^ 19937-1的一个C的实现。这种发生器产生32位的数字,在连续的周期长度内的k维度(1<= k <= 623 除了第0维,似乎出现的次数比较少)之间出现的数字的概率是一样的。有一个特征是, 只 有在k维较大时,每个数字的前n位, n<=16  出现的次数比较少。 在他们的论文中的表 II中给出。"  (介绍即将到来的通用乱数产生器  - ACM TOMACS Special Issue卷  匿名编辑)

 

”谢谢你发给我关于MT非常有趣的论文。我还记得你在蒙特利尔讨论这个课题时给我的深刻的印象。“ (Prof. H.Niederreiter.)

 

"我想更深入地研究你的(乱数)生成器。根据我们的测试和基础理论上的支持,这是我 到目前为止见过所有发布过的TT800生成器版本之中的的最好的一个。" (Prof. P. Hellekalek, 1996. 关于TT800的改良版 MT19937的笔记。)

  • 使用过人士的评价

"MT19937B with my optimizations takes 83% less time than ran2() from Numerical Recipies, which we had been using. Random number generation was a significant component of our DSMC application. Switching RNG's therefore reduced execution time for a 17% reduction in runtime for our full application on a typical problem. Since we usually run jobs for weeks on supercomputers, this translates directly into real time and money savings." (From Hawk: Direct Simulation Monte Carlo application for plasma simulation. Scalable Concurrent Programming Laboratory, Syracuse University.)
"I am a student interested in RNGs for crypto applications. I stumbled upon your mt19937b PRNG on the web and I am testing it to check whether it's suitable or not to key generation. Previously I tried other PRNGs but unfortunately they weren't good enough, mainly because (I guess) of short cycles. The problems arise when you try to periodically reseed the PRNG: even if you start the key-generation process with a different seed every time, sooner or later you'll have the PRNG falling into an already-passed state eventually obtaining the same key as before... Are the short cycles to blame?. Anyway this didn't happen so far with your mt19937b generator and I would be glad to know the reason of this improvement, namely: are you sure that reseeding your PRNG with *different* seeds (32 bit) I'll get a totally different output stream every time?"

Answer: the probability to get an overlapping sequences is very very very small, negligiblly small.
"I've been seeing good results from your mt19937b RNG in the simulation of a small multi-agent system for which many other generators have been giving poor to marginal results. The RNG is being used to help verify probabilistic calculations for this multi-agent system which give an accurate reference for comparison. Some initially worrying discrepancies disappeared when using mt19937b, so I'm quite grateful for you contribution. My work uses the CMU Common Lisp language and your algorithm has been implemented in lisp. A small change was made to the implementation of the tempering calculations to avoid overflowing 32bit numbers (the algorithm is unchanged). To further enhance performance an Intel x86 specific version has also been written, which runs about 33% faster than optimised C.
...
I'm currently helping to maintain CMUCL and since mt19937b seems to be performing well (and is faster) I was wondering if you would recommend and give permission to use mt19937b as the basis of a revised RNG for CMUCL which is distributed as public domain code?"

  • 面向数学学者的说明

この疑似乱数は数学的には非常に簡単です。2元体F2を係数とする、19937次元のベクトル空間 Vを考えます。End(V)の元で、固有多項式が既約なものを一つとり、fとします。2^19937-1が素数であることにより、fの周期は2^19937-1にならざるを得ません。(fの固有値はF_2^19937を生成する体だから。)

Vのベクトルを状態とし、fを次状態関数とする力学系を考えます。するとこの系の周期は2^19937-1。この力学系は、0を除く全ての状態をとるわけです。

VからF_2^32の適当な線形写像gを固定し、初期ベクトルvから力学系を動かしてgで出力をすると、 g(v), g(f(v)), g(f^2(v)), ...という32bit整数列が得られます。

問題は、 (1)いかに実現したとき効率のよいV, f, gを探す/作るか。 (2)出力の32bit整数列が、いくつか組にしてみた場合のラティス 構造の最適化(gを選ぶ)。の二つがあります。

(1)は、計算機のなかでのVの実現方法、fの特性多項式の既約性の判定など、かなり計算機アルゴリズム的アイデアになります。 fの計算量がVの次元によらないような、うまいアルゴリズムがあるのです。

既約性のためには、フロベニウス写像のオーダーを計算します。 2^19937-1の素数性をうまく使って、高速に既約性を判定するアルゴリズムをつくりました。

(2)は、Lenstraらが研究した「形式ベキ級数環における数の幾何」(最短基底)を使います。使い方は、Couture-Tezuka-Lecuyerによるものです。

僕としては、「純粋数学は実におどろくほど役に立っていて、人に 非難されるすじあいはない。」という証拠を作ろうと思って研究しました。