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 相关文章推荐
基于mootools插件实现遮罩层新手引导
May 24 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
浅谈jquery事件处理
Apr 24 Javascript
JS获取及验证开始结束日期的方法
Aug 20 Javascript
Angular Renderer (渲染器)的具体使用
May 03 Javascript
vue实现滑动到底部加载更多效果
Oct 27 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 Javascript
原生js实现贪吃蛇游戏
Oct 26 Javascript
一道JS算法面试题——冒泡、选择排序
Apr 21 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实现小型站点广告管理
2006/10/09 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
jquery实现上传文件进度条
2020/03/26 jQuery
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
Python最长公共子串算法实例
2015/03/07 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
寒假实习自荐信
2014/01/26 职场文书
高校教师自荐信范文
2014/03/13 职场文书
企业文化演讲稿
2014/05/20 职场文书
新教师岗前培训方案
2014/06/05 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
农村党支部承诺书
2015/04/30 职场文书
圆明园观后感
2015/06/03 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
python实现简单倒计时功能
2021/04/21 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python
从原生JavaScript到React深入理解
2022/07/23 Javascript