【问题标题】:What's the randomness quality of the Perlin/Simplex Noise algorithms?Perlin/Simplex 噪声算法的随机性质量如何?
【发布时间】:2012-09-10 12:08:41
【问题描述】:

Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?

两者哪个算法的随机性更好?

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

更新: 我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。

【问题讨论】:

    标签: algorithm random noise perlin-noise prng


    【解决方案1】:

    不要使用 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 在性能和视觉上的问题,但引入了它自己的问题。

    【讨论】:

      【解决方案2】:

      正如“随机数统计”AI Game Wisdom 2 中所述,询问哪个产生“更好”随机性取决于您使用它的目的。通常,PRNG 的质量通过测试电池进行比较。在印刷时,作者指出用于测试 PRNG 随机性的最知名和最广泛使用的测试电池是 ENTDiehard。另见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 的论点适用于改变 Simplex 噪声中使用的维数,因为“4D 单纯形噪声的 3D 部分不同于 3D 单纯形噪声”。 Stefan Gustavson 的Simplex noise demystified

      【讨论】:

        【解决方案3】:

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

        在这张图片中,噪声会生成一个像这样的二维高度图(图片来自here):

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

        因此,算法的结果实际上并不是“随机的”;如您所见,有许多易于辨别的模式。

        Simplex 看起来有点“好”,这意味着随机性更小,但它的主要目的是它产生类似的噪声,但更好地扩展到更高的维度。也就是说,如果产生 3D、4D、5D 噪声,单纯形噪声将优于 Perlin 噪声,并产生相似的结果。

        如果您想要一个通用的伪随机数生成器,请查看Mersenne twisterother 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 噪声具有八度音阶噪声的概念;也就是说,在不同的尺度上将噪声重新混合到自身中。这会产生更多的模式。因此,噪声的初始质量可能仅与预先计算的随机数组一样好,加上伪随机索引的效果。但毕竟柏林噪声对它的影响,明显的随机性显着降低(我认为它实际上分布在更广泛的区域)。

        【讨论】:

          【解决方案4】:

          我觉得你很困惑。

          perlin 和 simplex 从其他来源获取随机数并使其更少随机化,使它们看起来更像自然景观(仅随机数看起来不像自然景观)。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-19
            • 2012-09-26
            • 1970-01-01
            • 1970-01-01
            • 2011-10-21
            • 1970-01-01
            • 2012-03-30
            • 1970-01-01
            相关资源
            最近更新 更多