js生成随机数方法和实例


Posted in Javascript onJanuary 17, 2017

js生成一切随机数的基础都是Math.random(),这个方法比较特别,生成的随机数落在的区间是[0,1),进行一次操作的话,js只能生成一个类似于[n,m)这样,左闭右开的区间。所以当有一些特殊需求的时候,就势必要进行一些其它的操作,下面对各种需求进行简单的分析:

生成任意区间的整数

1.全闭区间[n,m]

这种的最常见,大家都知道的那一长串公式:Math.floor(Math.random()*(m-n+1))+n;就是生成这个全闭区间的方法。说到这个公式很多人都知道,但真正想明白的人估计很少。先生成一个[0,m-n+1)这样左闭右开的区间,然后用Math.floor()取到[0,m-n]之间内的任意整数(看明白这一步很关键),之后加上区间左端点变成[n,m]内的任意整数,达到目的。

说到这个地方,有一点必须提一下,随便搜一下js生成随机数,有很多文章都会用Math.ceil()Math.round()这两个方法,比如生成全闭的[n,m]区间内的任意整数,Math.ceil(Math.random()*(m-n))+n;或者Math.round(Math.random()*(m-n))+n;我感觉随机数,最重要的就是随机两个字,每个值取到的概率一定要相等,这一点对于一些特定的场合非常重要,比如抽奖(年会都有抽奖的吧)。

Math.ceil()的毛病是n<<m≈x,x为除端点之外的数,区间足够大的话n几乎取不到,m和x的概率几乎相等,因为m这个点取不到所以概率相对来说小了一点。Math.round()的毛病是n≈m=x/2,原因和前面的差不多,不明白的可以自己画个坐标轴,很明了。

2.全开区间(x,y)

其实只要记住上面的全闭区间,其它所有区间的开闭,都可以由其推到,过程如下:
(x,y) ==[x+1,y-1];也就是说n=x+1; m=y-1;将其代入上面的公式就可以得到:Math.floor(Math.random()*(y-x-1))+x+1;

3.左闭右开[x,y)

同理,[x,y) == [x,y-1];代入得到:Math.floor(Math.random()*(y-x))+x;

4.左开右闭(x,y]

(x,y]==[x+1,y];代入得到:Math.floor(Math.random()*(y-x))+x+1;

生成任意区间内的浮点数

这种实际当中用到的比较少,但也挺有意思的。

[n,m)

这种最简单,因为和random的特点保持一致。Math.rondom()*(m-n)+n;

因为random的这种特点,想要取到其它区间内的浮点数就比较困难了。需要借助一些判断才能才能满足要求。思想和上面去整数的一样。代码如下:

function fullClose(n,m) { //[n,m]
      var result = Math.random()*(m+1-n)+n;
      while(result>m) {
        result = Math.random()*(m+1-n)+n;
      }
      return result;
    }
    function fullOpen(n,m) { // (n,m)
      var result = Math.random()*(m-n)+n;
      while(result == n) {
        result = Math.random()*(m-n)+n;
      }
      return result;
    }
    function leftOpen(n,m) { // (n,m]
      var result = Math.random()*(m-n+1)+n-1;
      while(result<n) {
        result = Math.random()*(m-n+1)+n-1;
      }
      return result;
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的Location地址对象
Jan 16 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
Aug 24 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
js实现图片轮播效果
Dec 19 Javascript
jQuery使用each方法与for语句遍历数组示例
Jun 16 Javascript
JSON 必知必会 观后记
Oct 27 Javascript
Bootstrap CSS布局之表格
Dec 17 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
Aug 05 Javascript
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 jQuery
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 Javascript
jQuery表单插件ajaxForm实例详解
Jan 17 #Javascript
js实现手机拍照上传功能
Jan 17 #Javascript
angular实现form验证实例代码
Jan 17 #Javascript
基于jQuery实现数字滚动效果
Jan 16 #Javascript
5种JavaScript脚本加载的方式
Jan 16 #Javascript
WebPack基础知识详解
Jan 16 #Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 #Javascript
You might like
php 动态执行带有参数的类方法
2009/04/10 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
node.js超时timeout详解
2014/11/26 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
Python fileinput模块使用实例
2015/06/03 Python
python编程实现归并排序
2017/04/14 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
升职自荐信范文
2013/10/05 职场文书
护理专业毕业生自我鉴定
2013/10/08 职场文书
毕业生就业自荐书
2013/12/15 职场文书
中专生自我鉴定
2013/12/17 职场文书
干部培训自我鉴定
2014/01/22 职场文书
毕业寄语大全
2014/04/09 职场文书
考博专家推荐信
2014/05/10 职场文书
学校端午节活动方案
2014/08/23 职场文书
庆祝教师节标语
2014/10/09 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2015年征兵工作总结
2015/07/23 职场文书
体育委员竞选稿
2015/11/21 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
redis数据一致性的实现示例
2022/03/18 Redis