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 Autocomplete 结合asp.net使用要点
Oct 29 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
Mar 26 Javascript
JavaScript中的字符串操作详解
Nov 12 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
jQuery表单插件ajaxForm实例详解
Jan 17 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
基于IView中on-change属性的使用详解
Mar 15 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
JavaScrip数组去重操作实例小结
Jun 20 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
操作Oracle的php类
2006/10/09 PHP
php判断当前操作系统类型
2015/10/28 PHP
Symfony的安装和配置方法
2016/03/17 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
架构师岗位职责
2013/11/18 职场文书
前处理班长职位说明书
2014/03/01 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
教师三严三实心得体会
2014/10/11 职场文书
python标准库ElementTree处理xml
2022/05/20 Python
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers