Perlin噪声算法和单纯形噪声算法的随机性是什么?
这两种算法中哪一种具有更好的随机性?
与标准伪随机生成器相比,使用Perlin/Simplex作为随机数生成器有意义吗?
更新:我知道Perlin/Simplex噪声是用来做什么的。我只对随机性属性感兴趣。
发布于 2012-12-03 09:49:32
正如“随机数统计”中所述,AI Game Wisdom 2,问哪个产生“更好的”随机性取决于你使用它做什么。通常,PRNG的质量是通过测试电池来比较的。在印刷时,作者指出,用于测试PRNG随机性的最著名和最广泛使用的测试电池是ENT和Diehard。另请参阅how to test random numbers和why statistical randomness tests seem ad-hoc的相关问题。
除了测试典型PRNG的标准问题之外,测试Perlin噪声或单工噪声作为PRNG更加复杂,因为:
发布于 2012-09-20 01:31:10
Perlin噪声和单纯形噪声旨在生成有用的噪声,而不是完全随机的。这些算法通常用于创建程序生成的景观等。例如,它可以生成这样的地形(来自here的图像):

在此图像中,噪波生成如下所示的2D高度贴图(来自here的图像):

每个像素的颜色代表一个高度。在生成高度图之后,渲染器用于创建与图像的“高度”(颜色)相匹配的地形。
因此,算法的结果实际上不是“随机的”;正如您所看到的,有许多容易识别的模式。
单纯形看起来有点“好”,这意味着更少的随机性,但它的主要目的是产生类似的噪音,但更好地缩放到更高的维度。也就是说,如果一个人会产生3D,4D,5D噪声,单纯形噪声将优于Perlin噪声,并产生类似的结果。
如果您想要一个通用的伪随机数生成器,请查看Mersenne twister或other prngs。请注意,wrt到密码学,prngs可能充满了警告。
更新:
(对OPs更新问题的回应)
至于这些噪声函数的随机属性,我知道perlin noise使用(非常)穷人的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噪声具有八度噪声的概念;即,在不同的尺度上将噪声重新混合到自身中。这就产生了更多的模式。因此,噪声的初始质量可能仅与预计算的随机数组加上伪随机索引的效果一样好。但在perlin噪声对其做了所有这些之后,明显的随机性显着降低(我认为它实际上扩散到了更广泛的区域)。
发布于 2012-09-20 01:37:16
我想你是糊涂了。
perlin和simplex从其他来源获取随机数,并使其随机性较低,以便它们看起来更像自然景观(仅随机数看起来不像自然景观)。
因此,它们不是随机数的来源-它们是处理来自其他地方的随机数的一种方式。
即使它们是一个来源,它们也不是一个好的来源(这些数字是强相关的)。
https://stackoverflow.com/questions/12473434
复制相似问题