详谈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 相关文章推荐
javascript 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
js点击页面其它地方将某个显示的DIV隐藏
Jul 12 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
jQuery实现带滑动条的菜单效果代码
Aug 26 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
Mar 02 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
深入理解Vue transition源码分析
Jul 30 Javascript
JS实现的按钮点击颜色切换功能示例
Oct 19 Javascript
一个简单的node.js界面实现方法
Jun 01 Javascript
使用ng-packagr打包Angular的方法示例
Sep 21 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 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&amp;java(一)
2006/10/09 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
php图片裁剪函数
2018/10/31 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
JS查找孩子节点简单示例
2019/07/25 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python中的推导式使用详解
2015/06/03 Python
Python中super函数的用法
2017/11/17 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
优秀员工个人的自我评价
2013/11/29 职场文书
饭店工作计划书
2014/01/10 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
个人租房协议书
2014/04/09 职场文书
财务会计求职信范文
2015/03/20 职场文书
音乐之声观后感
2015/06/04 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
网络研修心得体会
2016/01/08 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
Python语言内置数据类型
2022/02/24 Python
delete in子查询不走索引问题分析
2022/07/07 MySQL