【发布时间】:2016-01-05 11:05:31
【问题描述】:
我目前在我的项目中使用 xorshift128+,我知道它通过了 Big Crush,并且被认为可以为它的速度生成相当高质量的随机数。但是,它会生成 64 位数字,而我需要的绝大多数随机数都是小整数(介于 0 和 100 左右之间)。
现在,使用 % 将 64 位随机数减少到所需范围会导致分布不均匀(某些数字出现的次数比其他数字多),并且在 2 的幂的情况下完全丢弃大部分位.生成数字直到某物在范围内的方法会产生更均匀的分布,但是对于小数字会有些问题,而且当我已经有太多的东西开始时生成更多的位感觉很愚蠢。
因此,我实现了一个系统,该系统采用最少的必要位数(寻找最接近的 2 次方,例如,如果我需要 0-95 的范围,我将采用 7 位 (2^7 = 128) 和继续生成 7 位,直到我得到低于 95 的东西,这应该总是有超过 50% 的概率,否则我只能少用一点)
无论如何,该系统已经到位,基本统计测试表明它按预期工作,而且运行速度极快。但是,我无法在修改后的系统上运行 TestU01(似乎没有内置对动态位大小的支持),并且原始论文对我来说有点太密集了。
基本上,我想知道是否像 xorshift128+ 声称的那样向前和向后传递 Big Crush,强烈建议每个单独的位都是令人满意的随机并且单独使用它们应该没问题,或者我是否可以设置自己为了麻烦。另外,可选地,任何可以让我凭经验验证生成器的统计质量的测试套件。
【问题讨论】:
-
这正是我在 onejoker 库中所做的,而且效果很好。我进行了广泛的测试。
-
关于经验测试的小问题。使用简单的 64 位模数,对高权重值的偏好是如此之小,以至于您必须收集许多 quintillions 的值才能开始测量具有统计意义的偏差。
标签: algorithm optimization random