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

时间:2016-11-28 14:40:31

标签: c random contiki

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

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

你能否告诉我一个快速的方法。

由于

2 个答案:

答案 0 :(得分:2)

那太顽皮了。

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

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

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

(如果确实想要中间位,则使用按位右移运算符>>&的混合。)

答案 1 :(得分:1)

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

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

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