2013-03-12 140 views
1

我正在开发Perlin噪声发生器,它基于种子整数和其他两个整数:x和y。种子伪随机数发生器

截至目前,伪随机数生成器看起来像这样:

private float noise(int x, int y) {  

    int n = x + y * seed; 
    return (1.0f - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff)/1073741824f); 

} 

但也存在一些问题,这样实现:首先,返回的时间间隔不是恒定的(理想情况下,我想使用[-1,1]或[0,1])和负x和y值,图案变得块状,看起来没有机构。 有没有办法改变我的公式(或者可能是全新的),这会使它适合我的需求?

+0

请提供一些关于您想要实现的更多信息。 – Frank 2013-03-12 09:11:59

+0

我需要一个伪随机数生成器,它基于3个种子(实际的种子,x和y,它们都是整数)工作,生成从-1到1的浮点数,当负数输入给出时也可以使用。 – Thiago 2013-03-12 15:43:30

+0

是这个JAVA?看起来像它。 – Frank 2013-03-12 15:45:40

回答

1

我用这一个(我发现它在网络上,但我没有原文链接了):

private double noise(int x, int y) { 
    int n=(int)x*331+(int)y*337; // add your seed on this line. 
    n=(n<<13)^n; 
    int nn=(n*(n*n*41333 +53307781)+1376312589)&0x7fffffff;  
    return ((1.0-((double)nn/1073741824.0))+1)/2.0; 

} 

您可以将您的种子容易添加到它。

+0

谢谢!这个函数产生的输出看起来非常好。我唯一的问题仍然是当我给负面坐标时,这给出了一个块状图案。你知道如何解决这个问题吗? – Thiago 2013-03-12 15:55:42

+0

abs()them ..... – Frank 2013-03-12 15:56:35

+0

是的,这是可行的,但它会使噪音轴对称,这不是我的目标。应该有另一种方法来实现它。 – Thiago 2013-03-12 16:19:56