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 相关文章推荐
基于jQuery的弹出框插件
Mar 18 Javascript
javascript函数声明和函数表达式区别分析
Dec 02 Javascript
jQuery中nextUntil()方法用法实例
Jan 07 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
js和jquery分别验证单选框、复选框、下拉框
Dec 17 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
Dec 22 Javascript
如何使用Bootstrap创建表单
Mar 29 Javascript
ECMAScript6变量的解构赋值实例详解
Sep 19 Javascript
ElementUI radio组件选中小改造
Aug 12 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php基础学习之变量的使用
2011/06/09 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
python和bash统计CPU利用率的方法
2015/07/10 Python
python re模块findall()函数实例解析
2018/01/19 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
网络优化专员求职信
2014/05/04 职场文书
2014中考励志标语
2014/06/05 职场文书
个人授权委托书
2014/09/15 职场文书
群众路线调研报告范文
2014/11/03 职场文书
车间质检员岗位职责
2015/04/08 职场文书
采购部年度工作总结
2015/08/13 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python