如何从随机数发生器返回中间位?
我有一个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是性能和质量之间非常好的权衡。