如何从随机数发生器返回中间位?

我有一个random_rand()函数,它产生一个介于0和RANDOM_RAND_MAX之间的随机数。 RANDOM_RAND_MAX定义为65535。

我想使用random_rand()结果的中间位而不是最低位,以便我可以更好地进行随机化。

你能告诉我一个快速的方法吗?

谢谢

那很顽皮。

线性同余生成器以这样的方式工作,即“最随机”部分包括低阶位。 几十年前,一个非常着名的IBM rand实现在绘图之后交换了最高和最低位,作为最后的繁荣 – 这被发现完全破坏了发电机!

所以保持简单。 生成随机数并使用%运算符或按位&提取最低有效位:虽然这会引入统计偏差,但效果并不比生成器本身差。

无论你最终做什么,总是对你的发电机进行一些统计检查,以确保它具有足够的统计特性。 在撰写本文时,似乎是“最佳”的生成方案是Mersenne Twister。

(如果你真的想要中间位,那么使用按位右移运算符>>& 。)

 result = (random_rand() >> 4) & 0xff 

这会将整个结果右移4位(破坏前4位),然后用二进制0000000011111111对结果进行逻辑与运算,因此只接下来的8位。

但是当你需要诉诸这些肮脏的黑客来提高伪随机数生成器的质量时,你应该考虑使用更好的PRNG。 例如, mersenne twister是性能和质量之间非常好的权衡。