QuickCheck中Int类型arbitrary值分布范围过小的原因探究
QuickCheck生成Int最大值偏小的原因及解决方法
QuickCheck默认的arbitrary生成Int的策略不是均匀随机分布,而是刻意偏向小数值(包括0、正负小整数)。这种设计是为了测试时更快触发边界条件错误——很多程序在处理0、-1这类小边界值时更容易出问题,小值优先的生成策略能更早暴露这类bug。
你生成10000个Int却只得到最大值30,完全符合这个设计逻辑,它不会像普通随机数工具那样在全Int范围内均匀采样。
如果需要生成均匀分布的整数,可以用两种方式:
- 用
arbitrarySizedIntegral:这个生成器的分布更接近均匀,会随测试的size参数调整数值范围,生成的数范围更广。 - 手动指定区间:用
choose函数限定范围,比如生成0到10000的均匀随机数:a <- generate (replicateM 10000 (choose (0, 10000))) :: IO [Int]
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

