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 相关文章推荐
utf8的编码算法 转载
Dec 27 Javascript
jQuery 开天辟地入门篇一
Dec 09 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
自写的jQuery异步加载数据添加事件
May 15 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
一个超简单的jQuery回调函数例子(分享)
Aug 08 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
JS document文档的简单操作完整示例
Jan 13 Javascript
ant design charts 获取后端接口数据展示
May 25 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
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
angularJS模态框$modal实例代码
2017/05/27 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
零基础学Python(一)Python环境安装
2014/08/20 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
JAVA程序员面试题
2012/10/03 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
应届毕业生个人求职自荐信
2014/01/06 职场文书
铁路工务反思材料
2014/02/07 职场文书
优质服务活动实施方案
2014/05/02 职场文书
交通安全横幅标语
2014/10/07 职场文书
部队2014年终工作总结
2014/11/27 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2019各种承诺书范文
2019/06/24 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript