您的位置:首页 > 其它

K.I.S.S.Random Genrator/ “保持简单”随机数发生器

2008-02-11 23:09 393 查看
(假)随机数发生器是Monte Carlo算法的基础,自然大家格外关注。

近几年,日本某君发明的Mersenne Twister[Makoto Matsumoto]可谓其中翘楚。

不过,它并非尽善尽美。一则它不适合用于数据加密,二则不能通过一些统计检验。

三嘛就是源程序比较长,不是一眼就能看明白的。

反过来,上世纪90年代后期就被Marsaglia[Marsaglia]发明出来的Keep-It-Simple-And-Stupid

算法却挺有趣而简短,而且能打通DIEHARD的各种检验[DIEHARD]。

下面是源代码:

unsigned int x = 123456789,

y = 362436000,

z = 521288629,

c = 7654321; /* Seed variables */

unsigned int KISS()

{

unsigned long long t, A = 698769069ULL;

x = 69069*x+12345;

y ^= (y<<13); y ^= (y>>17); y ^= (y<<5);

t = (A*z + c);

c = (t >> 32);

z = t;

return x+y+z;

}

居然就只是把“线性同余”,“移位轮转”和“带记忆乘法”这3种基本的随机数发生法一起用,

便获得很好的效果。的确够巧的,从这一点上说,比Mersenne Twister要有趣多了。

而且通过它,我们一次就学会3种随机数发生法。抽出其中任何1种,都可以单独使用,仿佛一把瑞士军刀。

[Makoto Matsumoto]Mersenne Twister Home Page
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
[Marsaglia]George_Marsaglia Wiki Page

en.wikipedia.org/wiki/George_Marsaglia

[DIEHARD]The Marsaglia Random Number CDROM
http://stat.fsu.edu/pub/diehard/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: