当前位置:  开发笔记 > 编程语言 > 正文

用于程序内容的快速伪随机数生成器

如何解决《用于程序内容的快速伪随机数生成器》经验,为你挑选了3个好方法。

我正在寻找一个伪随机数生成器,它可以专门在生成每个数字之前给定种子时快速工作.到目前为止,我见过的大多数生成器都假设您设置一次种子,然后生成一长串数字.到目前为止看起来与我见过的唯一相似的是Perlin Noise,但它产生了太"平滑"的数据 - 对于类似的输入,它往往会产生类似的结果.

生成器的声明应该类似于:

int RandomNumber1(int seed);

要么:

int RandomNumber3(int seedX, int seedY, int seedZ);

我认为拥有良好的RandomNumber1应该足够了,因为可以通过散列其输入并将结果传递给RandomNumber1来实现RandomNumber3,但是我编写了第二个原型,以防某些实现可以使用独立输入.

该生成器的预期用途是将其用于程序内容生成器,例如通过将树放置在网格中来生成森林,并确定每个位置的随机树种和随机空间偏移.

生成器需要非常高效(低于500个CPU周期),因为在渲染过程中会实时大量创建过程内容.



1> 小智..:

好像你要求哈希函数而不是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;
}

编辑:是的,一些哈希函数肯定看起来比其他人更合适.

为了您的目的,应该足以观察功能,并检查输入中的单位变化是否会传播到大量输出位.


对良好散列函数的一个测试是给它整数0,1,2的序列,并使用伪随机数生成器测试来测试输出的"随机性".
很好的答案,尽管我不同意“哈希函数*而不是PRNG”。通常,哈希函数并不总是好的随机数生成器(它们更多地用于其他属性:https://en.wikipedia.org/wiki/Hash_function#Properties),OP *确实*需要一定的质量随意性,否则他的森林看起来会是假的。话虽这么说,有些哈希函数可以制作“足够随机的” PRNG,并且在OP要求时它们肯定是确定性的。

2> Matt Howells..:

是的,您正在寻找快速整数哈希算法而不是PRNG.

这个页面有一些算法,我相信你会发现更多,因为你知道正确的搜索条件.

编辑:原始页面已被删除,可在GitHub上找到实时版本.



3> John D. Cook..:

这是George Marsaglia开发的一个小型随机数发生器.他是该领域的专家,因此您可以确信发电机具有良好的统计特性.

v = 36969*(v & 65535) + (v >> 16);
u = 18000*(u & 65535) + (u >> 16);
return (v << 16) + (u & 65535);

这里你和v是无符号整数.将它们初始化为任何非零值.每次生成随机数时,请将u和v存储在某处.你可以将它包装在一个函数中以匹配上面的签名(除了int是无符号的.)

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有