为什么我写的JavaScript双闭区间随机整数函数不包含下限值?
推导的核心漏洞
你的数学推导在理想数学逻辑上是成立的,但忽略了Math.random()的实际分布特性:
Math.random()返回的是**[0,1)区间内的连续均匀分布浮点数**,单个精确离散值(比如严格等于0)的发生概率为0,实际运行过程中几乎不可能触发这个边界值。- 对应你的代码逻辑,只有当
Math.random()严格返回0时,Math.ceil(0 * (num2 - num1))才会得到0,最终输出num1,但这个场景在实际运行中几乎不会出现,所以相当于下限值被实际排除了。
以你测试的randomEjector(3,4)为例验证
此时num2 - num1 = 1,Math.random() * 1的取值范围是[0, 1):
- 只有
x = 0时,Math.ceil(0) = 0,最终输出0 + 3 = 3,概率为0 - 只要
x > 0,x * 1就属于(0,1)区间,Math.ceil()向上取整后得到1,最终输出1 + 3 = 4,概率为1
这就是你测试时永远返回4的原因。
正确的实现写法
要实现包含两端的随机整数生成,应该使用Math.floor()而非Math.ceil(),区间计算需要加1覆盖两个端点的差值:
const randomEjector = (num1, num2) => { return Math.floor(Math.random() * (num2 - num1 + 1)) + num1 }
推导逻辑:
x ∈ [0, 1),乘以(num2 - num1 +1)后取值范围为[0, num2 - num1 + 1)Math.floor()向下取整后得到的整数范围为[0, num2 - num1],所有整数取值概率均等- 加
num1后最终范围为[num1, num2],完全符合要求
内容的提问来源于stack exchange,提问作者Xeroid
相关产品推荐
相关产品推荐

