详谈JS中实现种子随机数及作用


Posted in Javascript onJuly 19, 2016

前言

在前端开发中,尤其是游戏开发,经常会用到随机数,那么我们会第一时间想到:Math.random,大家略微的看看如下代码:

for (var i= 0; i<10; i++) { document.writeln(Math.random() +"<br />"); }

运行如上代码,也确实生成了10个不同的数字,当然你可以生成更多,看起来挺不错的,如果仅仅如此,那么本文就没必要写了。

示例

试着想一下,如果在某一个场景,我们做一个游戏,用户玩到一半的时候退出了,这样用户下次进来可以选择继续上一次的进度继续玩,那么现在问题来了:用户玩的进度以及用户的积分等简单的描述数据,我们都可以记录下来,但是游戏里绘制的障碍物、飞行物以及很多装饰类的小玩意儿,他们甚至是每次用户点开始随机输出的,要把画布上所有的东西以及它们的大小,位置等都记录下来,实在是没必要。

于是种子随机数就闪亮登场了,我们如果在画布上元素随机绘制的时候,有一个种子值,页面上所有元素的位置、大小等都是根据这个种子来算的,那么等到第二次绘制的时候只需要传入这个种子,就可以重现之前未完成的画布元素。

那么这个时候,你会发现JS里面自带的Math.random就不好使了,无法满足需求,我们继续看这段代码:

Math.seed = 5; Math.seededRandom = function(max, min) { max = max || 1; min = min || 0; Math.seed = (Math.seed * 9301 + 49297) % 233280; var rnd = Math.seed / 233280.0; return min + rnd * (max - min); }; for (var i= 0; i<10; i++) { document.writeln(Math.seededRandom() +"<br />"); }

运行如上代码你会发现如果种子Math.seed不变,那么生成的随机数是不会变化的,哦了,如果引入这个函数,那么重现游戏场景可以实现了,虽然还需要做更多的细节处理,但机制上是能保证的,本文的重点不是实现一个这样的游戏。

本文的重点是:(Math.seed * 9301 + 49297) % 233280,为什么会是这三个值,而不是其它的到底这三个数字有什么神秘的来历呢?

像Math.seededRandom这种伪随机数生成器叫做线性同余生成器(LCG, Linear Congruential Generator),几乎所有的运行库提供的rand都是采用的LCG,形如:

I n+1=aI n+c(mod m)

生成的伪随机数序列最大周期m,范围在0到m-1之间。要达到这个最大周期,必须满足:
1.c与m互质

2.a - 1可以被m的所有质因数整除

3.如果m是4的倍数,a - 1也必须是4的倍数

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

总结

以上就是关于种子随机数在JS中如何实现和作用介绍的内容,希望给JavaScript学习者有所帮助

Javascript 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
JavaScript 应用类库代码
Jun 02 Javascript
select 控制网页内容隐藏于显示的实现代码
May 25 Javascript
动态获取复选框checkbox选中个数的jquery代码
Jun 25 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
Mar 09 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
Aug 14 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
利用vue重构有赞商城的思路以及总结整理
Feb 21 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
Aug 03 Javascript
微信小程序获取当前位置和城市名
Nov 13 Javascript
全面了解JavaScript对象进阶
Jul 19 #Javascript
EasyUI中在表单提交之前进行验证
Jul 19 #Javascript
jQuery EasyUI提交表单验证
Jul 19 #Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 #Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 #Javascript
JS动态给对象添加事件的简单方法
Jul 19 #Javascript
老生常谈js动态添加事件--- 事件委托
Jul 19 #Javascript
You might like
PHP编程函数安全篇
2013/01/08 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
Python实现文件复制删除
2016/04/19 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
2014年两会学习心得范例
2014/03/17 职场文书
交通安全寄语大全
2014/04/08 职场文书
派出所所长先进事迹
2014/05/19 职场文书
经验交流材料格式
2014/12/30 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
公司出纳岗位职责
2015/03/31 职场文书
结婚通知短信大全
2015/04/17 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript