值噪声随机函数奇怪的输出

时间:2015-02-05 19:13:13

标签: c++ c gcc random mingw

我正在尝试实现这个随机函数,我将用于Value Noise:

float random(int x, int y){
    int r;
    float s;

    srand(y*hgrid+x+seed);

    r=rand();

    s = (float)(r & 0x7fff)/(float)0x7fff;

    return (s);
}

正如这个函数的作者所说的那样(https://code.google.com/p/fractalterraingeneration/wiki/Value_Noise):

  

重要的是要注意一些编译器有自己的RNG,所以   这可能对每个人都不起作用。 Visual C ++ 2008尤其如此   麻烦,但Linux上的GCC运行完美。

所以我在windows上尝试使用mingw。输出真的很奇怪,因为它给了我从0.0到1.0的增长数字。

在linux上,它的工作方式应该是0.0到1.0的随机数。

由于我正在使用mingw,它应该像gcc一样,我期待一些工作方式相同。

为什么它不起作用?有没有办法使它有效?

1 个答案:

答案 0 :(得分:1)

  

为什么不起作用?

您每次都重新播种随机数生成器,因此每个数字都是该种子值的简单函数。这似乎是想要的(所以你得到每个位置的一致值),但你不希望这个功能太简单。

听起来mingw实现将种子作为第一个生成的数字返回,而linux实现首先修改它。

  

有没有办法让它有效?

多次调用rand,以确保不仅仅获取种子值。或者编写您自己的计算,可能基于common implementation of rand

unsigned r = y*hgrid+x+seed;
r = r * 1103515245 + 12345;
return (float)(r & 0x7fff)/(float)0x7fff;