【问题标题】:Seeded Pseudo Random Number Generator种子伪随机数生成器
【发布时间】:2013-03-12 06:22:48
【问题描述】:

我正在开发一个基于种子整数和其他两个整数的 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值,图案变得块状,看起来根本不是有机的。 有没有办法改变我的公式(或者可能是一个全新的公式)以使其符合我的需求?

【问题讨论】:

  • 请提供更多关于您想要实现的目标的信息。
  • 我需要一个伪随机数生成器,它基于 3 个种子(实际种子 x 和 y,它们都是整数)工作,生成从 -1 到 1 的浮点数,并且在负输入为给定的。
  • 这是 JAVA 吗?看起来像。
  • 它是java,抱歉没有在问题中说出来。

标签: random numbers random-seed noise-generator


【解决方案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。
  • 我明白了,但我想实现“无限”(与 int 一样大)噪声。
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2014-05-18
相关资源
最近更新 更多