Nao*_*dar 3 c c++ random c++11
我试图实现一个简单的噪声函数,它接受两个整数,并根据种子结合两个参数返回一个随机浮点数.
使用std::mt19937效果很好,但出于某种原因,当我尝试使用srand时rand(),我会重复数字..
注意:
seed在循环中使用c ++ 11 成员函数非常非常慢.
这里有两个使用两种方法的地形(具有相同的重播号码):
c ++ 11随机:
std::random_device rd;
std::mt19937 g{ rd() };
std::uniform_real_distribution<float> gen{ -1.0, 1.0 };
float getNoise(int x, int z) {
g.seed(x * 523234 + z * 128354 + seed);
return gen(g);
}
Run Code Online (Sandbox Code Playgroud)
c随机:
float getNoise(int x, int z) {
std::srand(x * 523234 + z * 128354 + seed);
return static_cast<float>(std::rand()) / RAND_MAX * 2.0f - 1.0f;
}
Run Code Online (Sandbox Code Playgroud)
srand按预期工作?提前致谢.
编辑: 好抱歉不清楚,而且,我知道也许我错了但是让我尝试再次解释,我使用重播,因为我在迭代时使用相同的x和z坐标(不是相同的迭代).
我试图实现一个简单的噪声函数,它接受两个整数,并根据种子结合两个参数返回一个随机浮点数.
请不要说我不应该重新种植,我要故意重新种植.
你故意打破它,并问我们为什么它被打破,但需要注意的是我们不允许在房间里提到大猩猩.
不要重新种植.
[编辑]
好的,根据评论请求,这里是一个答案:
1)不,没有更快的方法来重新安装PRNG,你不应该这样做.适当地,你应该播种,然后通过丢弃几千个值来"升温"PRNG.
2)原因rand()(并且,即使您不相信它,您使用的任何其他PRNG)也不起作用是因为您的getNoise()功能不正确.
你的第三张图片是正确的.这是你的结果应该从简单的返回一个钳位随机值期待.
您试图通过弄乱种子来调制它,并且由于您在第一次尝试时表现出明显的视觉效果,因此得出结论认为这是正确的方法.然而,真正发生的事情是你只是削弱了PRNG并看到了结果.(在rand()尝试中更清楚,因为它的种子更粗略地定义了结果序列,它本身的周期比Mersenne Twister小.)
(尝试通过倾斜(x,z)坐标来修改它也是一个红色鲱鱼.它不会影响输出的实际随机性.)
TL; DR
你做错了.
如果你想生成地形图,你应该围绕分形地形生成谷歌.事实上,这里有一个不错的链接:http://www.gameprogrammer.com/fractal.html
你会发现它需要做更多的工作,但这些方法非常简单,你可以很容易地调整它们来修改你的结果.
希望这可以帮助.