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 动态生成私有变量访问器
Dec 06 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 Javascript
jquery插件pagination实现无刷新ajax分页
Sep 30 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
Angular2整合其他插件的方法
Jan 20 Javascript
微信小程序日历插件代码实例
Dec 04 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 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删除数组中重复元素的方法
2015/12/22 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python中的随机函数小结
2018/01/27 Python
python斐波那契数列的计算方法
2018/09/27 Python
keras 多任务多loss实例
2020/06/22 Python
python爬取天气数据的实例详解
2020/11/20 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
外贸业务员的岗位职责
2013/11/23 职场文书
早餐连锁店计划书
2014/01/08 职场文书
现场施工员岗位职责
2014/03/10 职场文书
小摄影师教学反思
2014/04/27 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
如何正确理解python装饰器
2021/06/15 Python
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android