求解释JavaScript生成指定范围内随机整数的代码逻辑
随机整数生成公式
Math.floor(Math.random() * (max - min + 1)) + min 原理解析 首先明确前置规则:JavaScript 中 Math.random() 方法的返回值是 左闭右开区间 [0, 1) 的随机浮点数,即取值包含0,永远不会等于1。
以下是公式各环节的运行逻辑拆解:
- 第一步:计算区间总个数
max - min + 1
我们需要的是包含min和max两端的闭区间整数,总数量要比两个数的差值多1。例如要生成2~5的整数,包含2、3、4、5共4个值,5-2+1=4刚好匹配总个数,这一步是保证最大值max能被正常取到的核心。 - 第二步:
Math.random() * (max - min + 1)
把[0, 1)的随机浮点数放大到区间总个数的范围,得到 左闭右开区间[0, 区间总个数)的随机浮点数。还是以2~5为例,这一步得到的是[0, 4)的浮点数,最小接近0,最大接近4。 - 第三步:
Math.floor(上述结果)Math.floor()的作用是向下取整,会直接舍弃浮点数的小数部分,只保留整数。[0, 4)的浮点数经过向下取整后,得到的是闭区间[0, 3]的整数,即0、1、2、3四种可能,每种取值的概率均等。 - 第四步:
+ min
把上一步得到的[0, 区间总个数-1]的整数做整体偏移,就可以得到我们需要的[min, max]区间的整数。上面的例子中加上最小值2之后,0+2=2,3+2=5,刚好覆盖2到5的所有整数。
补充说明
如果把Math.floor()换成Math.round()会出现概率不均的问题:两端的min和max的取值概率仅为中间数值的一半,因此向下取整是生成等概率随机整数的最优选择。
内容的提问来源于stack exchange,提问作者uday
相关产品推荐
相关产品推荐

