【发布时间】:2012-09-10 12:08:41
【问题描述】:
Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?
两者哪个算法的随机性更好?
与标准的伪随机生成器相比,使用 Perlin/Simplex 作为随机数生成器有意义吗?
更新: 我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。
【问题讨论】:
标签: algorithm random noise perlin-noise prng
Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?
两者哪个算法的随机性更好?
与标准的伪随机生成器相比,使用 Perlin/Simplex 作为随机数生成器有意义吗?
更新: 我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。
【问题讨论】:
标签: algorithm random noise perlin-noise prng
不要使用 perlin 或 simplex 来获得随机性。他们不是为此而生的。它们是随机性的/应用/。
人们选择这些是因为他们的视觉吸引力,这还没有得到充分讨论,所以我会集中讨论。
带有smoothstep 的perlin/simplex 非常平滑。无论您缩放多远,它们都将始终是渐变,而不是顶点或边缘。
输出范围为 (+/- 1/2 x #dimensions),因此您需要根据需要对其进行补偿以使其达到 0 到 1 或 -1 到 1 的范围。解决这个问题是标准的。添加八度音程会通过八度音程的比例因子来增加这个范围(当然,它通常是更大八度音程的一半)。
perlin/simplex 噪声具有奇怪的特性,放大时为棕色噪声,缩小时为蓝色噪声。无论是一个缩放还是中间缩放都不是特别适合 prng 目的,但它们非常适合伪造自然发生(这不是真正随机的,并且 /are/ 有空间偏差)。
perlin 和单纯形噪声都倾向于在轴上存在一些偏差,而 perlin 在这方面还有一些问题。编辑:在三个维度上摆脱更多的偏见是非常复杂的。很难(不可能?)在球体上生成大量无偏点。
perlin 结果往往是带有八边形偏差的圆形,而单纯形往往会生成带有六边形偏差的椭圆形。
一片高维单纯形看起来不像低维单纯形。但是 3d perlin 的 2d 切片看起来很像 2d perlin。
大多数人认为单纯形实际上无法处理更高的维度 - 对于更高的维度,它往往“看起来越来越糟糕”。据称 perlin 没有这个问题(尽管它仍然存在偏见)。
我相信一旦“八度”,它们在分层时都有相似的输出三角形分布(类似于滚动 2 个骰子)(如果有人可以为我仔细检查一下,我很高兴。)因此两者都受益于平滑步骤。这是标准的。 (它可能会偏向相同输出的结果,但由于空间相关性高,它仍然会存在尺寸偏差,导致 prng 质量测试失败,这是 /the/ 功能,而不是错误。)
请注意,八度技术不是 perlin 或 simplex 定义的一部分。这只是经常与它们结合使用的技巧。 perlin 和 simplex 在均匀分布的点处混合渐变。这种噪声的八度音阶被组合起来以创建更大和更小的结构。这也经常用于“值噪声”,它基本上使用与此概念等效的白噪声而不是柏林噪声。带有八度音阶的值噪声也会表现出/甚至更糟/八角形偏差。因此为什么首选 perlin 或 simplex。
simplex 在所有情况下都更快 - /特别是/在更高维度。
so simplex 修复了 perlin 在性能和视觉上的问题,但引入了它自己的问题。
【讨论】:
正如“随机数统计”AI Game Wisdom 2 中所述,询问哪个产生“更好”随机性取决于您使用它的目的。通常,PRNG 的质量通过测试电池进行比较。在印刷时,作者指出用于测试 PRNG 随机性的最知名和最广泛使用的测试电池是 ENT 和 Diehard。另见how to test random numbers和why statistical randomness tests seem ad-hoc的相关问题。
除了测试典型 PRNG 的标准问题之外,将 Perlin Noise 或 Simplex Noise 作为 PRNG 进行测试更加复杂,因为:
【讨论】:
Perlin 噪声和单纯形噪声旨在产生有用的噪声,而不是完全随机的。这些算法通常用于创建程序生成的景观等。比如可以生成这样的地形(图片来自here):
在这张图片中,噪声会生成一个像这样的二维高度图(图片来自here):
每个像素的颜色代表一个高度。生成高度图后,使用渲染器创建与图像的“高度”(颜色)匹配的地形。
因此,算法的结果实际上并不是“随机的”;如您所见,有许多易于辨别的模式。
Simplex 看起来有点“好”,这意味着随机性更小,但它的主要目的是它产生类似的噪声,但更好地扩展到更高的维度。也就是说,如果产生 3D、4D、5D 噪声,单纯形噪声将优于 Perlin 噪声,并产生相似的结果。
如果您想要一个通用的伪随机数生成器,请查看Mersenne twister 或other prngs。请注意,对于密码学,prngs 可能充满警告。
更新:
(对 OP 更新问题的回应)
至于这些噪声函数的随机属性,我知道 perlin 噪声使用(非常)穷人的 prng 作为输入,并在相邻的“随机”像素之间进行一些平滑/插值。输入随机性实际上只是对预先计算的随机向量的伪随机索引。
索引是使用一些简单的整数运算来计算的,没什么花哨的。例如,noise++ 项目使用预先计算的“randomVectors”(参见here)来获取其源噪声,并在来自该向量的不同值之间进行插值。它通过一些简单的整数运算在这个向量中生成一个“随机”索引,添加少量的伪随机性。这是一个sn-p:
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 从其他来源获取随机数并使其更少随机化,使它们看起来更像自然景观(仅随机数看起来不像自然景观)。
所以它们不是随机数的来源 - 它们是处理来自其他地方的随机数的一种方式。
即使它们是一个来源,它们也不是一个好的来源(这些数字具有很强的相关性)。
【讨论】: