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 相关文章推荐
判断脚本加载是否完成的方法
May 26 Javascript
javascript concat数组累加 示例
Sep 03 Javascript
关于this和self的使用说明
Aug 01 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
AngularJS实现图片上传和预览功能的方法分析
Nov 08 Javascript
基于dataset的使用和图片延时加载的实现方法
Dec 11 Javascript
JS实现简单的星期格式转换功能示例
Jul 23 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
全面解析Vue中的$nextTick
Dec 24 Vue.js
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
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
Python文件处理
2016/02/29 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
如何基于python操作json文件获取内容
2019/12/24 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
学习Python爬虫的几点建议
2020/08/05 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
工作交流会欢迎词
2014/01/12 职场文书
承认错误的检讨书
2014/01/30 职场文书
小学生新年寄语
2014/04/03 职场文书
限期整改通知书
2015/04/22 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis