2016-09-24 28 views
0

我正在嘗試編寫一個函數,以便f(x, y, seed)返回0.0到1.0之間的一些浮點數。 xy是兩個浮點數,而seed將是一個整數。結果應該看起來像一個隨機數,但使用相同的參數將始終返回相同的結果。我計劃使用這個地形生成(使用Perlin噪聲),但效果應該是可以從給定的種子創建白噪聲(x和y參數對應於圖像中的位置)。如何生成播種的2D白噪聲

我已經研究過使用哈希函數來實現這一點,但是我遇到的所有問題都不接受浮點數,不會產生一致的結果(因此0.0到1.0之間的每個數字具有相同的可能性) ,顯示出明顯的模式,或者對於緊密座標的結果變化不大)

+0

您是否有可用的網格尺寸? –

回答

0

四處尋找了幾個小時後,我碰到這個傳來:https://groups.google.com/forum/#!msg/proceduralcontent/AuvxuA1xqmE/T8t88r2rfUcJ

特別是,我使用了從亞當·斯密的答案,使這個:

def rot(x, b): 
    return((x<<b)^(x >> (32 - b))) 

def pcghash(x, y, seed): 
    for l in range(0, 3): 
     x = rot(x^0xcafebabe + y^0xfaceb00c + seed^0xba5eba11, 23) 
     x = rot(x^0xdeadbeef + y^0x8badf00d + seed^0x5ca1ab1e, 5) 
     x = rot(x^0xca11ab1e + y^0xfacefeed + seed^0xdeadc0de, 17) 
    return(x^y^seed) 

def noise(x, y, seed): 
    return(float('0.' + str(pcghash(x, y, seed))[-10:])) 

這需要座標和一個種子,並返回一個均勻分佈在0.0和1.0之間的數字(小數點後10位)。我對此並不滿意,因爲所有參數都必須是整數,有很多未使用的生成位,並且我確信noise()函數中的代碼可以改進得更快,但這適合我目的。

編輯:一個多更好的人可以在這裏(https://www.shadertoy.com/view/4djSRW)在hash12()函數發現:

float hash12(vec2 p) { 
    vec3 p3 = fract(vec3(p.xyx) * .1031); 
    p3 += dot(p3, p3.yzx + 19.19); 
    return fract((p3.x + p3.y) * p3 
} 

這是GLSL,但應該很容易在其他語言中實現。此外,雖然這是一種二維到一維哈希函數,但其​​他人可以在Shadertoy着色器上鍊接。

0

取決於您希望達到的分配,但例如對於均勻分佈在已知的圖像大小,你可以這樣做:

width = 100 

from random import random 
def f(x, y, seed): 
    rng = random(seed) 
    rng.jumpahead(x * width + y) 
    return rng.random() 

或者,如果您有可用來代替x和y的像素的序號索引,你不需要網格大小:

from random import random 
def f(n, seed): 
    rng = random(seed) 
    rng.jumpahead(n) 
    return rng.random() 
+0

我正在嘗試做無限的程序地形,所以不幸的是我沒有圖像大小。然而,我正在尋找一個統一的分佈,我可能會適應這一點。謝謝 – Elyxian