【问题标题】:value noise random function strange output值噪声随机函数奇异输出
【发布时间】:2015-04-05 18:57:20
【问题描述】:

我正在尝试实现这个我将用于值噪声的随机函数:

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,所以我期待一些工作方式相同。

为什么它不起作用?有没有办法让它工作?

【问题讨论】:

    标签: c++ c gcc random mingw


    【解决方案1】:

    为什么它不起作用?

    您每次都在重新播种随机数生成器,因此每个数字都是该种子值的简单函数。这似乎是我们想要的(因此您可以为每个位置获得一致的值),但您不希望函数过于简单。

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

    有没有办法让它工作?

    不止一次致电rand,以确保您不会只取回种子值。或者编写自己的计算,可能基于common implementation of rand

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

    【讨论】:

    • 确实,调用 rand 2 次给了我随机数。谢谢!
    • 这不是一个特别好的生成器。 Wiki 文章引用的 Park 和 Miller 文章为线性全等算法设定了一个标准,尽管当时他们发现大多数都缺乏,但在过去的 25 年里,人们会期望库实现者会转换到更合理的变体。
    • 我可能会补充一点,您从不希望您的基本生成器返回一个浮点数(尽管在这个问题的特定情况下这可能是可以的);当您需要固定数量的具体值时,返回浮点数使得无法纠正固有偏差。
    • @JamesKanze:确实,我只是提供了对调用rand() 的改进,并没有时间研究一个不熟悉的问题域以找到最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2011-06-20
    • 2011-05-12
    • 2011-12-06
    • 2016-08-22
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多