JavaScript如何生成1-100区间均匀分布的随机整数
1-100均匀随机整数实现方案
原代码存在的问题
你写的初始版本有两个明显问题:
- 存在拼写错误:
Math.randon()是错误写法,正确API为Math.random() - 概率分布不均的核心原因:
Math.round()执行四舍五入逻辑时,区间首尾值的命中区间长度只有中间值的一半。以1-100范围为例,Math.random()*(max-min)+min生成的数值范围是[1,100):- 命中1需要值落在[1, 1.5),区间长度0.5
- 命中2~99任意整数需要值落在[n-0.5, n+0.5),每个数对应区间长度为1
- 命中100需要值落在[99.5, 100),区间长度0.5
首尾数值的选中概率仅为中间数值的50%,完全不满足抽奖场景的公平性要求。
正确均匀分布实现
使用Math.floor()向下取整,调整随机数映射区间,保证每个整数对应的命中区间长度完全一致,即可实现真正的均匀分布:
function getRandomInt(min, max) { // 处理入参,确保边界为整数 const minVal = Math.ceil(min); const maxVal = Math.floor(max); // 映射逻辑: // Math.random() 生成[0,1)左闭右开的浮点数 // 乘以(maxVal - minVal + 1)后得到[0, 差值+1)范围的数 // 向下取整得到[0, 差值]范围的均匀整数,加minVal后刚好覆盖[minVal, maxVal]闭区间所有整数 return Math.floor(Math.random() * (maxVal - minVal + 1)) + minVal; } // 调用示例:获取1-100之间的随机中奖号码 console.log(getRandomInt(1, 100));
这个实现中每个整数对应的随机值区间长度完全相等,所有数字被选中的概率一致,符合抽奖场景的公平性要求。
内容的提问来源于stack exchange,提问作者Rodhis
相关产品推荐
相关产品推荐

