随机数生成算法

常见版本
function rnd( seed ){
seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数?
return seed / ( 233280.0 );
};

function rand(number){
today = new Date();
seed = today.getTime();
return Math.ceil( rnd( seed ) * number );
};

myNum=(rand(5));

9301, 49297, 233280 是线性同余生成器(LCG, Linear Congruential Generator),常用的一组参数。公式很简单,a,c,m分别就是你这3个数字:

生成的伪随机数序列最大周期m,范围在0到m-1之间。要达到这个最大周期,必须满足
c与m互质
a - 1可以被m的所有质因数整除
如果m是4的倍数,a - 1也必须是4的倍数
以上三条被称为Hull-Dobell定理。
从工程的角度来讲,的值要(在合理的范围内)足够小,以避免溢出的问题。从安全(实用)性的角度来讲,还要满足良好的随机性,这一点可以通过Knuth’s Spectral Test来评估(见[2][3]),要通过2,3,4,5以及6维的Spectral Test才行。Spectral Test考察的就是生成的伪随机数序列在超空间的网格结构(lattice structure),当年IBM的RANDU子程序闹出的乌龙,连3维的Spectral Test就不能通过
在这种要求面前,c的值最好:
是质数 (c = 49297就是质数)
接近(1/2-1/6*genhao3 )m , (m = 233280时为49297.86460172205)
更加详尽的了解LCG伪随机数生成器的性质以及参数选取、测试的数学理论,可以尝试阅读《计算机程序设计艺术》卷2第3章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值