我想生成满足0 <= result <= maxValue
.
我已经有一个生成器,它返回内置无符号整数类型的全部范围内的统一值。让我们调用 this byte Byte()
、ushort UInt16()
和uint UInt32()
的方法ulong UInt64()
。假设这些方法的结果是完全一致的。
我想要的方法的签名是uint UniformUInt(uint maxValue)
and ulong UniformUInt(ulong maxValue)
。
我在找什么:
- 正确性
我希望返回值分布在给定的时间间隔内。
但是如果可以显着提高性能,那么非常小的偏差是可以接受的。我的意思是,在给定 2^64 值的情况下,允许区分概率为 2/3 的顺序偏差。
它必须对任何maxValue
. - 性能
该方法应该很快。 - 效率
该方法确实消耗很少的原始随机性,因为根据底层生成器,生成原始字节可能会很昂贵。浪费几位是可以的,但消耗 128 位来生成一个数字可能是多余的。
也可以在某些成员变量中缓存上一次调用中遗留的一些随机性。
小心 int 溢出和包装行为。
我已经有了一个解决方案(我会把它作为答案发布),但这对我的口味来说有点难看。所以我想获得更好的解决方案的想法。
关于如何使用大maxValue
s 进行单元测试的建议也很好,因为我无法生成具有 2^64 个桶和 2^74 个随机值的直方图。另一个复杂情况是,对于某些错误,只有一些maxValue
分布有很大的偏差,而另一些则只有很小的偏差。