为何使用Math.floor(Math.random()*(max-min+1))+min定义随机数范围?
解释随机整数范围公式:
Math.floor(Math.random() * (max - min + 1)) + min 嘿,这个问题问得特别到位!我当初第一次碰到这个公式的时候也琢磨了好久,咱们一步步拆解来理解就清晰多了:
先搞懂基础:Math.random()的特性
首先要明确,Math.random()返回的是一个大于等于0,小于1的随机浮点数,也就是区间[0, 1)。它本身只能生成0到1之间的数,没法直接得到我们想要的min到max的整数,所以需要做一系列转换。
拆解公式的每一步
1. 计算max - min + 1:确定随机数的总个数
这一步是为了算出「从min到max的整数一共有多少个」。举个例子:
- 如果min=2,max=5,那我们想要的数是2、3、4、5,一共4个
- 计算
5-2+1=4,刚好等于总数 - 如果不加这个
+1,5-2=3,就会少算一个数(这里就是少了5)
简单说,这一步是把「数值范围」转换成「数量范围」,确保我们能覆盖到所有想要的整数。
2. Math.random() * (max - min + 1):放大随机数区间
把Math.random()的结果乘以刚才算出的总数,会把区间从[0,1)放大到[0, max-min+1)。还是用上面的例子:
Math.random() * 4会得到[0,4)之间的浮点数,比如0.2、3.999、2.5等等
3. Math.floor(...):把浮点数转成整数
Math.floor()是向下取整,会把刚才的浮点数转换成大于等于0,小于max-min+1的整数。例子里就是:
Math.floor(0.2)=0,Math.floor(3.999)=3,Math.floor(2.5)=2- 最终得到的整数是0、1、2、3,刚好4个,和我们需要的数量一致
4. + min:平移到目标区间
最后把得到的整数加上min,就把区间从[0, max-min]平移到了[min, max]。例子里:
- 0+2=2,3+2=5,1+2=3,2+2=4
- 正好得到我们想要的2、3、4、5这四个数
反例:如果不加+1会怎么样?
还是用min=2,max=5的例子:
- 如果写成
Math.floor(Math.random() * (max - min)) + min,也就是Math.floor(Math.random()*3)+2 Math.random()*3得到[0,3),floor之后是0、1、2- 加2之后是2、3、4,少了5,这就不符合我们要的min到max的完整范围了
所以这个+1是确保我们能包含max这个边界值的关键!
内容的提问来源于stack exchange,提问作者Hacene .N
相关产品推荐
相关产品推荐

