如何从随机数发生器回到中间位?(How to return middle bits from ran

2019-09-29 03:39发布

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

我想用中间位来自()random_rand的结果,而不是最低阶位,这样我可以让randomiztion更好。

能否请你告诉我一个快速的方法来做到这一点。

谢谢

Answer 1:

这是淘气。

线性同余发生器以这样的方式即“最随机”部分包括低阶位工作。 一个非常著名的IBM实现rand几十年的绘画作为最终的蓬勃发展后,前交换了最高和最低位轮-这被认为完全毁掉发电机!

所以,让事情变得简单。 生成的随机数,并提取使用的至少显著位%运算符或按位& :虽然这引入了统计偏差,效果是不超过发电机本身更糟糕。

不管你做什么,最终总是在你生成器上运行的一些统计检查,以确保它有足够的统计特性。 在写这篇文章,这似乎是“最好的之一”的生成方案的时间是梅森倍捻机。

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



Answer 2:

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

该权利由四位(破坏前四个位)之后使整个结果逻辑上和与二进制结果0000000011111111所以只能采取下一个8位。

但是,当你需要求助于这种诡异的技巧来提高你的伪随机数发生器的质量,您应该考虑而使用更好的PRNG来代替。 在梅森难题 ,例如,是性能和质量之间的一个很好的权衡。



文章来源: How to return middle bits from random number generator?
标签: c random contiki