如何实现按指定概率生成对应数值区间的随机数?
实现符合指定概率分布的区间随机数生成函数
首先,我们需要将概率与对应的数值区间一一关联,然后通过生成随机数匹配概率区间,最后在选中的区间内生成随机数。以下是完整的实现代码:
function getRandomAmount() { // 定义概率与对应区间的映射 const distributions = [ { prob: 0.75, min: 100, max: 500 }, { prob: 0.2, min: 501, max: 5000 }, { prob: 0.04, min: 10001, max: 50000 }, { prob: 0.01, min: 50001, max: 100000 } ]; // 生成0到1之间的随机数 const random = Math.random(); let cumulativeProb = 0; // 遍历找到匹配的区间 for (const dist of distributions) { cumulativeProb += dist.prob; if (random <= cumulativeProb) { // 在选中的区间内生成随机整数 return Math.floor(Math.random() * (dist.max - dist.min + 1)) + dist.min; } } // 兜底返回(理论上不会走到这里) return 100; }
代码说明:
- distributions数组:把每个概率对应的数值区间封装成对象,方便后续遍历匹配。
- Math.random():生成0(包含)到1(不包含)的随机数,用来匹配预设的概率分布。
- 累积概率判断:通过累加概率值,判断随机数落在哪个概率区间内,从而选中对应的数值区间。
- 区间内随机数生成:使用公式
Math.floor(Math.random() * (max - min + 1)) + min生成[min, max]范围内的整数随机数,如果需要浮点数,去掉Math.floor即可。
验证方法:
你可以通过多次调用函数并统计结果分布来验证概率是否符合要求:
// 统计10000次调用的结果分布 const counts = { range1: 0, range2: 0, range3: 0, range4: 0 }; for (let i = 0; i < 10000; i++) { const num = getRandomAmount(); if (num >=100 && num <=500) counts.range1++; else if (num >=501 && num <=5000) counts.range2++; else if (num >=10001 && num <=50000) counts.range3++; else if (num >=50001 && num <=100000) counts.range4++; } console.log(counts); // 输出结果应接近:range1≈7500, range2≈2000, range3≈400, range4≈100
内容的提问来源于stack exchange,提问作者tommm2
相关产品推荐
相关产品推荐

