我有一个random_rand()函数,它产生一个介于0和RANDOM_RAND_MAX之间的随机数。 RANDOM_RAND_MAX定义为65535。
我想使用random_rand()结果的中间位而不是最低位,这样我可以更好地进行随机化。
你能否告诉我一个快速的方法。
由于
答案 0 :(得分:2)
那太顽皮了。
线性同余生成器以这样的方式工作,即“最随机”部分包括低阶位。几十年前,一个非常着名的IBM rand
实现将绘制后的最高位和最低位交换为最终的繁荣 - 这被发现完全破坏了生成器!
所以保持简单。使用%
运算符或按位&
生成随机数并提取最低有效位:虽然这会引入统计偏差,但效果并不比生成器本身差。
无论你最终做什么,总是对你的发电机进行一些统计检查,以确保它具有足够的统计特性。在撰写本文时,似乎是“最佳”的生成方案是Mersenne Twister。
(如果确实想要中间位,则使用按位右移运算符>>
和&
的混合。)
答案 1 :(得分:1)
result = (random_rand() >> 4) & 0xff
这会将整个结果右移4位(破坏前4位),然后使用二进制0000000011111111
逻辑与AND结果,因此只接下来的8位。
但是当你需要诉诸这些肮脏的黑客来提高伪随机数生成器的质量时,你应该考虑使用更好的PRNG。例如,mersenne twister是性能和质量之间非常好的权衡。