Perlin/Simplex噪声算法的随机性质是什么?

Zhe*_*hen 6 random algorithm noise prng perlin-noise

Perlin Noise算法和Simplex噪声算法的随机性质是什么?

哪两种算法具有更好的随机性?

与标准伪随机生成器相比,使用Perlin/Simplex作为随机数生成器是否有意义?

更新:我知道Perlin/Simplex Noise用于什么.我只是对随机属性感到好奇.

Rea*_*law 5

Perlin噪声和单纯噪声旨在产生有用的噪声,而不是完全随机的.这些算法通常用于创建程序生成的景观等.例如,它可以生成这样的地形(此处的图像):

由perlin噪音产生的地形

在此图像中,噪声会生成2D高度图(例如此处的图像):

由perlin噪声生成的高度图

每个像素的颜色代表一个高度.生成高度图后,渲染器用于创建与图像的"高度"(颜色)匹配的地形.

因此,算法的结果实际上并不是"随机的"; 你可以看到,有很多容易辨别的模式.

据说Simplex看起来有点"更好",这意味着随机性较低,但其主要目的是产生类似的噪音,但更好地扩展到更高的尺寸.也就是说,如果产生3D,4D,5D噪声,单纯形噪声将胜过Perlin噪声,并产生类似的结果.

如果你想要一个通用的伪随机数发生器,请查看Mersenne twister其他prngs.请注意,加密密码学,prngs可以充满警告.

更新:

(对OPs更新问题的回应)

至于这些噪声函数的随机属性,我知道perlin噪声使用(非常)穷人的prng作为输入,并在相邻的"随机"像素之间进行一些平滑/插值.输入随机性实际上只是伪随机索引到预先计算的随机向量中.

使用一些简单的整数运算来计算索引,没什么太奇特的.例如,noise ++项目使用预先计算的"randomVectors"(参见此处)来获取其源噪声,并在此向量的不同值之间进行插值.它通过一些简单的整数运算为这个向量生成一个"随机"索引,增加了少量的伪随机性.这是一个片段:

int vIndex = (NOISE_X_FACTOR * ix + NOISE_Y_FACTOR * iy + NOISE_Z_FACTOR * iz + NOISE_SEED_FACTOR * seed) & 0xffffffff;
vIndex ^= (vIndex >> NOISE_SHIFT);
vIndex &= 0xff;

const Real xGradient = randomVectors3D[(vIndex<<2)];

...
Run Code Online (Sandbox Code Playgroud)

然后对稍微随机的噪声进行平滑,并且实际上与相邻像素混合,产生图案.

产生初始噪声后,perlin/simplex噪声具有八度噪声的概念; 也就是说,将噪声重新混合到不同的尺度.这产生了更多的模式.因此,噪声的初始质量可能仅与预先计算的随机数组一样好,再加上伪随机索引的效果.但毕竟perlin噪声对它有影响,表观随机性显着下降(实际上它扩展到我想的更广泛的区域).


Pik*_*lek 3

正如《 AI 游戏智慧 2》《随机数统计》中所述,询问哪个产生“更好”的随机性取决于您使用它的用途。一般来说,PRNG 的质量是通过测试电池来比较的。在印刷时,作者指出用于测试 PRNG 随机性的最著名和最广泛使用的测试组合是ENTDiehard。另外,请参阅如何测试随机数以及为什么统计随机性测试看起来是临时的相关问题。

除了测试典型 PRNG 的标准问题之外,测试 Perlin 噪声或单纯形噪声作为 PRNG 更为复杂,因为:

  1. 两者内部都需要 PRNG,因此它们输出的随机性受到底层 PRNG 的影响。
  2. 大多数 PRNG 缺乏可调参数。相比之下,柏林噪声是一个或多个相干噪声函数(倍频程)的总和,频率不断增加,幅度不断减小。由于最终图像取决于所使用的八度音程的数量和性质,因此随机性的质量将相应变化。libnoise:修改噪声模块的参数
  3. 类似于 #2 的论点适用于改变单纯形噪声中使用的维数,因为“4D 单纯形噪声的 3D 部分不同于 3D 单纯形噪声”。Stefan Gustavson 的单纯形噪声揭秘