我正在尝试从 32 位输入中导出伪随机 32 位值。
为此,我使用了这个杂音哈希:
uint32_t murmur(uint32_t key, uint32_t seed)
{
uint32_t k = ( key ^ seed ) * 0x5bd1e995;
k = k ^ (k>>24);
return k;
}
令我惊讶的是,与高 16 位相比,低 16 位的随机性质量存在很大差异。
如果我使用最低 16 位生成随机单位向量,我会在球体上得到清晰的图案,极点和子午线可见。
如果我使用最高 16 位生成随机单位向量,我会得到更好的点分布。
这是 MURMUR 的一个基本问题,还是我用错了?
我提供给它的关键是值 [0,1,.. N] 乘以大素数 2521008887。
对于 3D 矢量的 x/y/z 坐标,我使用随机选择的种子 0xb7295179、0x18732214、0x9531f133。
0xffff0000 位的随机性直观地检查出来。0x0000ffff 位的随机性不会。