Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?
两者哪个算法的随机性更好?
与标准的伪随机生成器相比,使用 Perlin/Simplex 作为随机数生成器有意义吗?
更新:我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。
Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?
两者哪个算法的随机性更好?
与标准的伪随机生成器相比,使用 Perlin/Simplex 作为随机数生成器有意义吗?
更新:我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。
Perlin 噪声和单纯形噪声旨在产生有用的噪声,而不是完全随机的。这些算法通常用于创建程序生成的景观等。例如,它可以生成这样的地形(图片来自这里):
在此图像中,噪声会生成一个 2D 高度图,如下所示(来自此处的图像):
每个像素的颜色代表一个高度。生成高度图后,渲染器用于创建与图像的“高度”(颜色)匹配的地形。
因此,算法的结果实际上并不是“随机的”;如您所见,有许多易于辨别的模式。
据称,单纯形看起来有点“好”,这意味着更少的随机性,但它的主要目的是它产生类似的噪声,但可以更好地扩展到更高的维度。也就是说,如果产生 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)];
...
然后将稍微随机的噪声平滑并实际上与相邻像素混合,从而产生图案。
在产生初始噪声之后,perlin/simplex 噪声具有噪声倍频程的概念;也就是说,在不同的尺度上将噪声重新混合到自身中。这会产生更多的模式。所以噪声的初始质量可能只与预先计算的随机数组一样好,加上伪随机索引的效果。但毕竟柏林噪声对它的影响,明显的随机性显着降低(我认为它实际上分布在更广泛的区域)。
我想你很困惑。
perlin 和 simplex 从其他来源获取随机数并降低它们的随机性,使它们看起来更像自然景观(仅随机数看起来不像自然景观)。
所以它们不是随机数的来源——它们是从其他地方处理随机数的一种方式。
即使它们是一个来源,它们也不是一个好的来源(这些数字是密切相关的)。
如“随机数的统计”中所述,AI Game Wisdom 2询问哪个产生“更好”的随机性取决于您使用它的目的。通常,PRNG 的质量通过测试电池进行比较。在印刷时,作者指出用于测试 PRNG 随机性的最著名和最广泛使用的测试电池是ENT & Diehard。此外,请参阅有关如何测试随机数以及为什么统计随机性测试似乎是临时的相关问题。
除了测试典型 PRNG 的标准问题之外,将 Perlin 噪声或 Simplex 噪声测试为 PRNG 更为复杂,因为:
不要使用 perlin 或 simplex 来获得随机性。他们不是为此而生的。它们是随机性的/应用/。
人们选择这些是因为他们的视觉吸引力,这还没有得到充分的讨论,所以我将重点关注这一点。
带有 smoothstep 的 perlin/simplex 非常平滑。无论您缩放多远,它们都将始终是渐变,而不是顶点或边缘。
输出范围为 (+/- 1/2 x #dimensions),因此您需要对此进行补偿,以根据需要使其达到 0 到 1 或 -1 到 1 的范围。解决这个问题是标准的。添加八度音阶将通过八度音阶的比例因子来增加这个范围(当然,它通常是更大八度音阶的一半)。
perlin/simplex 噪声具有奇怪的质量,放大时为棕色噪声,缩小时为蓝色噪声。无论是一个缩放还是中间缩放都不是特别适合prng目的,但是它们非常适合伪造自然发生(这不是真正随机的,并且/是/有空间偏见的)。
perlin 和单纯形噪声都倾向于沿轴有一些偏差,而 perlin 在这方面还有一些问题。编辑:在三个维度上摆脱更多的偏见是非常复杂的。很难(不可能?)在球体上生成大量无偏点。
perlin 结果往往是带有八边形偏差的圆形,而单纯形往往会产生带有六边形偏差的椭圆形。
一片高维单纯形看起来不像低维单纯形。但是 3d perlin 的 2d 切片看起来很像 2d perlin。
大多数人认为单纯形实际上无法处理更高的维度——对于更高的维度,它往往“看起来越来越糟”。据称 perlin 没有这个问题(虽然它仍然有偏见)。
我相信一旦“八度”,它们在分层时都有相似的输出三角形分布,(类似于滚动 2 个骰子)(如果有人可以为我仔细检查的话,我很喜欢。)因此两者都受益于平滑步骤。这是标准的。(它可能会偏向相同输出的结果,但由于空间相关性高,它仍然会存在尺寸偏差,导致 prng 质量测试失败,这是 /the/ 功能,而不是错误。)
请注意,八度技术不是 perlin 或 simplex 定义的一部分。这只是经常与它们结合使用的技巧。perlin 和 simplex 在均匀分布的点处混合渐变。这种噪声的八度音阶被组合起来以创建更大和更小的结构。这也经常用于“值噪声”,它基本上使用与此概念等效的白噪声而不是柏林噪声。带有八度音阶的值噪声也会表现出/甚至更糟/八角形偏差。因此为什么首选 perlin 或 simplex。
单纯形在所有情况下都更快 - /特别是/在更高维度。
所以 simplex 解决了 perlin 在性能和视觉上的问题,但引入了它自己的问题。