2012-09-18 155 views
6

Perlin噪聲算法和Simplex噪聲算法的隨機性質量是多少?Perlin/Simplex噪聲算法的隨機性質量是多少?

這兩種算法哪一種具有更好的隨機性?

與標準僞隨機生成器相比,使用Perlin/Simplex作爲隨機數生成器有意義嗎?

更新: 我知道Perlin/Simplex噪聲用於什麼。我只是好奇隨機性。

回答

3

正如「隨機數統計」AI Game Wisdom 2中所述,詢問產生「更好」隨機性的問題取決於您使用它的目的。通常,PRNG的質量通過測試電池進行比較。在印刷時,作者指出最廣爲人知的用於測試PRNGs隨機性的測試電池是ENT & Diehard。另請參閱how to test random numberswhy statistical randomness tests seem ad-hoc的相關問題。

除了測試典型的PRNG,測試柏林噪聲或單工噪聲的PRNG是更復雜的標準問題,因爲:

  1. 在內部需要PRNG,因而其輸出的隨機性是由底層PRNG影響。
  2. 大多數PRNG缺少可調參數。相反,柏林噪聲是一個或多個相干噪聲函數(八度)的總和,其頻率不斷增加,幅度不斷減小。由於最終圖像取決於所使用八度音的數量和性質,因此隨機性的質量也會相應變化。 libnoise: Modifying the Parameters of the Noise Module
  3. 與#2類似的論點適用於改變單純形噪聲中使用的維數,因爲「4D單純形噪聲的3D部分不同於3D單純形噪聲」。 Stefan Gustavson的Simplex noise demystified
5

柏林噪聲和單純噪聲意味着產生有用的噪聲,而不是完全隨機的。這些算法通常用於創建程序生成的景觀等。例如,它可以生成地形如此(從here圖像):

Terrain generated from perlin noise

在該圖像中,噪聲生成2D高度圖,如該(從here圖像):

Heightmap generated by perlin noise

每個像素的顏色代表一個高度。生成高度圖後,渲染器用於創建與圖像的「高度」(顏色)匹配的地形。

因此,算法的結果實際上不是「隨機的」;正如你所看到的,有很多容易辨別的模式。

單純形似乎看起來有點「更好」,這意味着隨機性會降低,但其主要目的是產生相似的噪音,但更好地擴大到更高的維度。也就是說,如果能產生3D,4D,5D噪聲,單純形噪聲將優於Perlin噪聲,併產生相似的結果。

如果你想要一個普通的僞隨機數發生器,看看Mersenne twisterother prngs。被警告,與密碼學,prngs可以充滿警告。

更新:

(針對OP的更新問題)

至於這些噪聲功能的隨機屬性,我知道Perlin雜採用了(非常)窮人的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噪聲對它來說,表觀隨機性顯着下降(它實際上遍佈我認爲更廣泛的區域)。

3

我覺得你很困惑。

培林和單從其他來源採取隨機數,使他們少隨機讓他們看起來更像自然景觀(隨機數字本身不喜歡看自然景觀)。

所以它們不是隨機數的來源 - 它們是從別處處理隨機數的一種方式。

即使他們是一個來源,他們也不會是一個好的來源(這些數字是強相關的)。