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

时间:2012-09-18 08:48:00

标签: algorithm random noise perlin-noise prng

Perlin噪声算法和单纯形噪声算法的随机性质是什么?

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

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

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

4 个答案:

答案 0 :(得分:5)

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

Terrain generated from perlin noise

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

Heightmap generated by perlin noise

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

因此,算法的结果实际上并不是随机的&#34 ;;正如你所看到的那样,有很多容易识别的模式。

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

如果您想要一般的伪随机数生成器,请查看Mersenne twisterother prngs。请注意,加密,prngs可以充满警告。

<强>更新

(对OP更新问题的回应)

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

使用一些简单的整数运算来计算索引,没什么太奇特的。例如,noise ++项目使用预先计算的&#34; randomVectors&#34; (参见here)获取其源噪声,并在此向量的不同值之间进行插值。它产生一个&#34;随机&#34;使用一些简单的整数运算索引到此向量,添加少量伪随机性。这是一个片段:

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)];

...

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

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

答案 1 :(得分:3)

我觉得你很困惑。

perlin和simplex从其他来源获取随机数并使它们 less 随机,这样它们看起来更像自然景观(单独的随机数看起来不像自然景观)。

所以它们不是随机数的来源 - 它们是从其他地方处理随机数的一种方式。

即使它们是来源,它们也不是一个好的来源(这些数字是强相关的)。

答案 2 :(得分:3)

如“随机数统计”中所述,AI Game Wisdom 2,询问产生“更好”随机性的因素取决于您使用它的原因。通常,PRNG的质量通过测试电池进行比较。在印刷时,作者指出最着名的&amp;用于测试PRNG随机性的最广泛使用的测试电池是ENT&amp; Diehard。另请参阅how to test random numberswhy statistical randomness tests seem ad-hoc的相关问题。

除了测试典型PRNG的标准问题之外,测试Perlin Noise或Simplex Noise作为PRNG更加复杂,因为:

  1. 两者内部都需要PRNG,因此其输出的随机性受基础PRNG的影响。
  2. 大多数PRNG缺乏可调参数。相反,Perlin噪声是一个或多个相干噪声函数(八度音阶)的总和,其频率不断增加且幅度不断减小。由于最终图像取决于所用八度音程的数量和性质,因此随机性的质量会相应变化。 libnoise: Modifying the Parameters of the Noise Module
  3. 类似于#2的参数适用于改变单纯形噪声中使用的维数,因为“4D单纯形噪声的3D部分与3D单纯形噪声不同”。 Stefan Gustavson的Simplex noise demystified

答案 3 :(得分:0)

请勿将perlin或单纯形用于随机性。他们不是为了那个。它们是随机的/ application/。

人们选择它们是为了获得视觉吸引力,但尚未进行充分讨论,因此我将重点介绍。

带有平滑步长的

perlin / simplex非常光滑。无论您缩放多远,它们始终都是渐变,而不是顶点或边缘。

输出范围是(+/- 1/2 x #dimensions),因此您需要对此进行补偿,以使其达到0到1或-1到1的范围。解决这个问题是标准的。添加八度音程会将该范围增加八度音阶的比例因子(当然,通常是大八度音阶的一半)。

佩林/单一杂讯具有怪异的品质,即放大时为棕色噪声,缩小时为蓝色噪声。既没有缩放功能,也没有中间缩放功能,但是对于伪造自然事件(它们确实是随机的,并且/在空间上有偏见)而言,它们都很棒。

佩林(Perlin)和单纯形噪声在轴向上都倾向于有一些偏差,佩林(Perlin)在该区域还有更多问题。编辑:摆脱三个方面的更大偏差是非常复杂的。很难(不可能)在球上生成大量无偏点。

perlin结果倾向于是带有八角形偏斜的圆形,而单纯形倾向于生成带有六角形偏斜的椭圆形。

高维单纯形的切片看起来不像低维单纯形。但是2d切片的3d perlin看起来就像2d perlin。

大多数人认为单纯形实际上无法处理更高的尺寸-对于更高的尺寸,它趋于“看起来越来越糟”。据说perlin没有这个问题(尽管仍然有偏见)。

我相信,一旦“八度”,它们在分层时都具有相似的三角形输出分布(类似于滚动2个骰子)(如果有人可以对我进行仔细检查,则非常喜欢。),因此两者都受益于平稳的步伐。这是标准的。 (有可能使结果偏向于相等的输出,但由于高度的空间相关性,它仍然存在尺寸偏倚而无法通过prng质量测试,这是/ the /功能,不是bug。)

请注意,八度音阶技术不是perlin或单纯形定义的一部分。这只是经常与他们结合使用的一种技巧。在均匀分布的点上,perlin和单纯形混合渐变。将这些噪声的八度音结合起来,可以创建更大或更小的结构。这在“值噪声”中也经常使用,该值基本上使用等效于此概念的白噪声代替珀林噪声。八度音阶的值噪声也将表现出甚至更差的八角形偏差。因此为什么首选perlin或simplex。

在所有情况下,简化都是更快的-特别是在更高维度上。

因此,单纯形修复了Perlin在性能和视觉方面的问题,但引入了自己的问题。