我正在寻找一个伪随机数生成器,它可以专门在生成每个数字之前给定种子时快速工作.到目前为止,我见过的大多数生成器都假设您设置一次种子,然后生成一长串数字.到目前为止看起来与我见过的唯一相似的是Perlin Noise,但它产生了太"平滑"的数据 - 对于类似的输入,它往往会产生类似的结果.
生成器的声明应该类似于:
int RandomNumber1(int seed);
要么:
int RandomNumber3(int seedX, int seedY, int seedZ);
我认为拥有良好的RandomNumber1应该足够了,因为可以通过散列其输入并将结果传递给RandomNumber1来实现RandomNumber3,但是我编写了第二个原型,以防某些实现可以使用独立输入.
该生成器的预期用途是将其用于程序内容生成器,例如通过将树放置在网格中来生成森林,并确定每个位置的随机树种和随机空间偏移.
生成器需要非常高效(低于500个CPU周期),因为在渲染过程中会实时大量创建过程内容.
好像你要求哈希函数而不是PRNG.谷歌搜索"快速哈希函数"产生了几个有希望的结果.
例如:
uint32_t hash( uint32_t a) a = (a ^ 61) ^ (a >> 16); a = a + (a << 3); a = a ^ (a >> 4); a = a * 0x27d4eb2d; a = a ^ (a >> 15); return a; }
编辑:是的,一些哈希函数肯定看起来比其他人更合适.
为了您的目的,应该足以观察功能,并检查输入中的单位变化是否会传播到大量输出位.
是的,您正在寻找快速整数哈希算法而不是PRNG.
这个页面有一些算法,我相信你会发现更多,因为你知道正确的搜索条件.
编辑:原始页面已被删除,可在GitHub上找到实时版本.
这是George Marsaglia开发的一个小型随机数发生器.他是该领域的专家,因此您可以确信发电机具有良好的统计特性.
v = 36969*(v & 65535) + (v >> 16); u = 18000*(u & 65535) + (u >> 16); return (v << 16) + (u & 65535);
这里你和v是无符号整数.将它们初始化为任何非零值.每次生成随机数时,请将u和v存储在某处.你可以将它包装在一个函数中以匹配上面的签名(除了int是无符号的.)