2016-09-24 52 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