Tag: 位操作程序

在Int32或UInt32中使用散列位的好方法是什么?

我有一个伪随机数发生器的实现,特别是George Marsaglia的XOR-Shift RNG。 我的实现在这里: FastRandom.cs 事实certificate,第一个随机样本与种子密切相关,如果你看一下Reinitialise(int seed)方法,这是相当明显的。 这是不好的。 我建议的解决方案是混合种子的位如下: _x = (uint)( (seed * 2147483647) ^ ((seed <> 48) * 28111) ^ ((seed <> 32) * 69001) ^ ((seed <> 16) * 45083)); 因此,我通过将种子的位乘以四个素数并将XORing重新形成_x来显着削弱任何相关性。 我还在乘法之前旋转种子的位,以确保不同幅度的位在32位值的整个值范围内混合。 四向旋转似乎在无所事事和每次可能的旋转之间取得了很好的平衡(32)。 素数是“手指在空中” – 足够的幅度和位结构可以使位混乱并将它们“扩展”到整个32位,而不管起始种子如何。 我应该使用更大的素数吗? 是否有一个标准的方法来解决这个问题,或许有更正式的基础? 我试图以最小的CPU开销来做到这一点。 谢谢 ===更新=== 我决定使用一些质数,其中设置位更好地分布在所有32位上。 结果是我可以省略移位,因为乘法实现了相同的效果(在整个32位范围内的散列位),所以我只需添加四个产品来给出最终的种子…… _x = (uint)( (seed * 1431655781) + (seed * […]