2015-02-05 82 views
0

我想实现,我会为价值噪声使用该随机函数:值噪声随机函数怪输出

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

为什么没有它的工作原理?

您正在重新发送随机数发生器,因此每个数字都是该种子值的简单函数。这似乎是想要的(所以你为每个位置获得一致的值),但是你不希望函数太简单。

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

有没有办法让它的作品?

不止一次致电rand,以确保您不会只获取种子值。或者写一个自己的计算方法,或许是基于一个common implementation of rand

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

确实,调用rand 2次给了我随机数。谢谢! – Aulaulz 2015-02-05 19:42:44

+0

这不是一个特别好的发生器。 Wiki文章引用的Park和Miller的文章为线性一致算法设定了一个标准,尽管当时他们发现大部分都缺乏,在过去的25年中,人们会认为图书馆实施者会转换到更合理的变体。 – 2015-02-05 21:06:07

+0

我可能会补充说你_never_希望你的基本生成器返回一个浮点数(尽管在这个问题的特定情况下这可能是确定的);当你需要固定数量的具体数值时,返回一个浮点数就不可能纠正内在的偏差。 – 2015-02-05 21:23:11