C#按百分比实现概率分配的代码正确性验证咨询
结论
该代码无法准确实现10% : 10% : 80%的预期分布,存在两处问题
问题说明
- 区间边界计算错误
Random.Next(100)的返回值范围为左闭右开区间[0, 100),会生成0~99共100个等概率的整数。你的代码中第一个判断条件clickPercentage <= 20 / 2等价于clickPercentage <=10,覆盖0~10共11个取值,对应概率11%;第二个判断clickPercentage <=20覆盖1120共10个取值,对应概率10%;剩余2199共79个取值,对应概率79%,和预期分布不符。 - 高频调用场景下的随机数种子问题
如果Random randomGen = new Random();定义在方法内部,每次调用都会重新实例化,Random默认使用系统时钟作为种子,短时间内多次实例化会生成相同的随机数,进一步破坏概率分布。
修正方案
正确的区间划分规则为:
0~9共10个值返回Group A(10%),10~19共10个值返回Group B(10%),20~99共80个值返回IsRandom = false(80%),使用<代替<=避免边界计数错误,同时将Random实例提升为类级静态成员避免重复实例化:
// 类级静态随机数实例,全局复用 private static readonly Random randomGen = new Random(); ... int clickPercentage = randomGen.Next(100); if (clickPercentage < 10) { return new RandomGroup {IsRandom = true, Group = "A"}; } else if (clickPercentage < 20) { return new RandomGroup { IsRandom = true, Group = "B" }; } else { return new RandomGroup { IsRandom = false }; }
内容的提问来源于stack exchange,提问作者elad
相关产品推荐
相关产品推荐

