2016-11-28 60 views
1

我有一个random_rand()函数,它产生一个介于0和RANDOM_RAND_MAX之间的随机数。 RANDOM_RAND_MAX定义为65535.如何从随机数发生器中返回中间位?

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

您能否请我演示一个快速的方法来做到这一点。

谢谢

+4

您认为这会“更好”吗? –

+0

假设生成的数字的低位是 不是非常随机的,并且使用中位比较好。 – user6480616

+0

“据说”?有没有说这个的参考? –

回答

2

这是淘气。

线性同余发生器以这样一种方式工作,即“最随机”部分由较低位组成。几十年前,一个非常着名的IBM实现rand在绘图之后将最高位和最低位交换为最终的蓬勃发展 - 这被发现彻底破坏了发生器!

所以保持简单。使用%运算符或按位&生成随机数并提取最低有效位:虽然这引入了统计偏差,但效果并不比生成器本身差。不管你最终做什么,总是对你的生成器运行一些统计检查,以确保它有足够的统计特性。在撰写本文时,似乎是“最好的”一代的发电计划是Mersenne Twister。

(如果你真的想要的中间位,然后用按位向右移位运算符>>&的混合物。)

+0

感谢您的回复。我认为最低位是最不随机的。我正在努力获得中间位。 – user6480616

+1

否。最低位将具有最好的随机性统计特性。 – Bathsheba

+0

维基百科的一句名言:“当m是2的幂时,LCG的低阶比特不应该依赖任何随机程度,事实上,简单地用2n代替模数项表明低阶比特通过非常短的周期,特别是,当m是2的幂时,任何全周期LCG将产生交替的奇数和偶数结果。“ – kfx

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

该权利由四位(摧毁第一个移动的整体结果四位),然后逻辑与结果为二进制0000000011111111,因此只有下一个8位被采用。

但是,当你需要诉诸这种肮脏的黑客来提高伪随机数发生器的质量时,你应该考虑改用更好的PRNG。例如,mersenne twister是性能和质量之间非常好的折衷方案。

+0

感谢您的帮助。 – user6480616