Tag: 统一

生成具有一定最大值的均匀随机整数

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