gpt4 book ai didi

algorithm - Perlin/Simplex Noise 算法的随机性质量如何?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:39:23 29 4
gpt4 key购买 nike

Perlin Noise算法和Simplex Noise算法的随机性如何?

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

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

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

最佳答案

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

Terrain generated from perlin noise

在这张图片中,噪声生成了这样的 2D 高度图(图片来自 here ):

Heightmap generated by perlin noise

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

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

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

如果你想要一个通用的伪随机数生成器,请查看 Mersenne twisterother prngs .请注意,关于密码学,prng 可能充满警告。

更新:

(对 OP 更新问题的回应)

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

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

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 noise在产生初始噪声后,有了octave of noise的概念;也就是说,以不同的比例将噪声重新混合到自身中。这会产生更多的模式。因此,噪声的初始质量可能仅与预先计算的随机数组一样好,再加上伪随机索引的影响。但在柏林噪声对其产生影响之后,明显的随机性显着降低(我认为它实际上分布在更广阔的区域)。

关于algorithm - Perlin/Simplex Noise 算法的随机性质量如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12473434/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com