js random获取随机数,获取任意范围内随机整数
壹 ❀ 引
想着好久没做笔试题了,去GitHub找了面试相关的项目,结果被第一道题难住了.....说难其实也不难,而是我忘记了取范围随机整数怎么写了,不可否认如果当时是我在笔试,肯定也凉了,那么就由这道题引出本文。
对了,如果你要取范围整数的方法,请跳到文章尾部,但如果你想知道为什么这么写,请阅读本文,那么本文开始:

贰 ❀ 关于random()
若要取随机整数,前提得知道数组API中的Math.random()方法能取0--1的随机数,它的范围是[0,1),也就是取包括0但不包括1的随机数。
其次,数组API中有一个Math.floor()方法代表向下取整,Math.floor(X)的代表的是取≤ X 且最接近X的整数。
那么我们可以通过Math.random()先取得随机数,再通过乘法计算得到大致范围,最后通过Math.floor()进行取整加工就可以达到目的了。
1.取[n,m)范围随机整数
比如,我要取 [0,100) 范围的随机整数,包括0但不包括100:
//[0,1)*100 => [0,100) 范围是0-99.99999...随机数
Math.random() * 100;
//向下取整加工,范围变成 0-99
Math.floor(Math.random() * 100);
0-100好理解一点,那我们怎么取 [2,32) 之间随机整数呢,思路相同:
当random取到0时,我们希望最后结果是2,所以需要有个加2的操作,那么32的情况只能拆分成30 + 2,所以应该是先乘法得到30,再有个加2的操作,像这么写:
Math.floor(Math.random() * 30) + 2;
结合上面2个例子,我们大概可以得出一个规律,取 [n,m) 包括n但不包括m的随机整数公式:
Math.floor(Math.random() * (m-n)) + n;
2.取[n,m]范围随机整数
如何取得包含n且包含m的随机整数呢,我们还是以好计算的[0,100]为例子。
按照前面的写法无法取到100,怎么办呢,我们直接在计算时得到一个100.99999,然后向下取整不就是100了,所以我们需要在乘以100的基础上再加上一个1。
需要注意的是加1操作的不能在random乘法计算完之后,你想想如果是乘完后加1,假设random乘法得到0再加个1,那最少的数字就是1了,所以加1必须是在乘法的时候加,所以应该是这样:
Math.floor(Math.random() * 101);
这样根据 [0,1) 的范围算出来的范围就是 [0,101),因为不包括101,所以就是[0,100]了。
针对 [2,32] 呢,简单分析一波,random是0时,我们希望得到2;假设random可以是1,我们希望得算出一个33才行,这样向下取整就能包含32了。
根据上面的分析,所以我们得让random乘法得到一个31,然后再加一个2,应该这么写:
Math.floor(Math.random() * 31) + 2;
我们大概可以得到一个规律,求 [n,m] 范围内的随机整数时,应该这样:
Math.floor(Math.random() * (m - n + 1)) + n;
那么取范围随机整数问题解决了,我们来解决那道笔试题:
let arr = new Array(5);
function randomArr(i = 0, min = 2, max = 32) {
let num = Math.floor(Math.random() * (max - min + 1)) + min;
if (!arr.includes(num)) {arr[i] = num;i++;};
return i < 5 ? randomArr(i) : arr;
};
let result = randomArr();
没超过十五行,虽然 if 这里没换行,看着不太美观,试了下,完全没问题,那么我们成功解决了这个问题。
叁 ❀ 玩点花样
既然知道了如何取范围内随机数,查了下,颜色强度范围是 [0-255] ,那么我们来做个随机变色的背景图。
function random(min = 0, max = 255) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
function randomColor() {
let r = random(),
g = random(),
b = random();
return `rgb(${r},${g},${b})`;
};
let color = randomColor();
然后,我们做出这么个东西:

肆 ❀ 总
那么写到这,我们掌握了这些知识:
1.Math.random()可用来获取 [0,1) 范围的随机数,包括0但不包括1。
2.Math.floor()可对数字进行向下取整,取整规则是小于等于且最接近该数字的整数。
3.取 [n,m) 范围的随机整数通用公式
Math.floor(Math.random() * (m-n)) + n;
4.取 [n,m] 范围的随机整数通用公式
Math.floor(Math.random() * (m - n + 1)) + n;
5.如何利用取范围随机整数来获取随机颜色。
那么本文先结束,留个问题,为什么取整数不能使用round方法,或者ceil方法呢,为什么要使用floor方法?
若有兴趣,请阅读博主为何随机取整要用floor,而非ceil或round呢
js random获取随机数,获取任意范围内随机整数的更多相关文章
- java Math.random()生成从n到m的随机整数
Java中Math类的random()方法可以生成[0,1)之间的随机浮点数.而double类型数据强制转换成int类型,整数部分赋值给int类型变量,小数点之后的小数部分将会丢失. 如果要生成[0, ...
- Java获取随机数获取制定范围指定个数不重复的随机数
一.JDK中提供的两种方式 1.Math类中的random()方法public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 [0. ...
- js 为何范围内随机取整要用floor,而不是ceil或者round呢
壹 ❀ 引 我在如何使用js取任意范围内随机整数这篇博客中,列举并分析了取[n,m)与[n,m]范围内整数的通用方法,并在文章结果留了一个疑问:为什么通用方法中取整操作,我们使用Math.floor ...
- java 获取随机数的三种方法
方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...
- Java获取随机数的几种方法
Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...
- js生成[n,m]的随机数,js如何生成随机数,javascript随机数Math.random()
一.预备知识 Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ 1 ...
- JS random函数深入理解(转载)
转载自:(本文对读者有帮助的话请移步支持原作者) http://www.cnblogs.com/starof/p/4988516.html 一.预备知识 Math.ceil(); //向上取整. M ...
- JS生成限定整数区间范围内的随机整数
对于整数区间获取随机整数: m,n均为整数,且n>m. 获取[m,n)区间内的随机整数: 1 var aNumber = (n - m) * Math.random() + m; 2 var r ...
- JS中生成随机数
1.Math 对象方法: Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ ...
随机推荐
- WPF应用程序的启动画面[Splash Screen本质分析]
原文:WPF应用程序的启动画面[Splash Screen本质分析] 不经意间发现了wpf的这个小玩意,感觉蛮有意思的.我在项目中添加了一张图片 如图: wpf-1.JPG(10.73 K) 2010 ...
- 16.Nov Working Note
05 今天也很忙,版本发布在即,但之前的日志系统发现了bug:在中文模式下python读写抛出异常,通过转化为utf8除去异常,上传到服务器还有乱码. 另外,就是多组件安装时,多线程发生冲突.因为每一 ...
- eclipse 插件编写(四)
前言 前面几篇文章讲了下如果编写简单的eclipse插件,如创建插件项目.编写右键弹出菜单等功能,接下来主要写一下如何生成代码的功能,这一片的功能跟插件本身的编写关联不太大,主要处理插件之后的业务内容 ...
- PING[ARC2]: Heartbeat failed to connect to standby 'gqtzdb_dg'. Error is 16047
Data Guard搭建完毕之后,执行开启归档路径2,结果发现不同步, SQL> alter system set log_archive_dest_state_2=enable; 查看错误日志 ...
- Android零基础入门第74节:Activity启动和关闭
上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学习如何启动和关闭Activity. 一.概述 经 ...
- Android Java调用Qt写的so库
有时候,我们反编译apk得到一个so库,如果直接使用这个so库的话,必须使用原来so库同样的package名字,才能用.这样人家反编译你的apk,就知道你侵犯了人家的版权.为了达到混淆的目的,我们可以 ...
- Win7和Vista的安全机制对于应用程序读取配置文件相关操作的影响(虚拟重定向技术)
今天构造了一个新版本的XXXX软件,并且在纯净的系统下进行了较为全面的测试.测试中也发现了一些问题.其中包括在Win7测试时程序竟然在另一个目录中创建了文件夹和配置文件,并且进行相关读取操作,却并没有 ...
- <iOS小技巧>UIview指定设置控件圆角
一.用法: 众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型. 利用班赛尔曲线画角: //利用班赛尔曲线画角 UIB ...
- vue-cli脚手架 ,过滤器,生命周期钩子函数
一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...
- Kafka笔记3
向Kafka写入消息从创建一个ProducerRecord对象开始,ProducerRecord需要包含目标主题和要发送的内容,我们还可以指定键或分区,在发送ProducerRecord对象时,生产者 ...