首页 > 其他 > 详细

不使用Math.random实现随机数。

时间:2014-10-27 00:13:17      阅读:367      评论:0      收藏:0      [点我收藏+]
var rand = (function(){
  var today = new Date(); 
  var seed = today.getTime();
  function rnd(){
    seed = ( seed * 9301 + 49297 ) % 233280;
    return seed / ( 233280.0 );
  };
  return function rand(number){
    return Math.ceil(rnd(seed) * number);
  };
})();
console.log(rand(100));

实现原理:

入门级的选择标准
这种伪随机数生成器叫做线性同余生成器(LCG, Linear Congruential Generator),几乎所有的运行库提供的rand都是采用的LCG,形如:
bubuko.com,布布扣
生成的伪随机数序列最大周期m,范围在0到m-1之间。要达到这个最大周期,必须满足

  • c与m互质
  • a - 1可以被m的所有质因数整除
  • 如果m是4的倍数,a - 1也必须是4的倍数

以上三条被称为Hull-Dobell定理。
作为一个伪随机数生成器,周期不够大是不好意思混的,所以这是要求之一。
可以看到,a=9301, c = 49297, m = 233280这组参数,以上三条全部满足。

不使用Math.random实现随机数。

原文:http://www.cnblogs.com/cdwp8/p/4053033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!