重新种植std :: randc 11

重新种植std :: randc 11,第1张

概述我试图实现一个简单的噪声函数,它接受两个整数,并根据种子结合两个参数返回一个随机浮点数. 使用std :: mt19937效果很好,但出于某种原因,当我尝试使用带有rand()的srand时,我得到重复的数字.. Note: Using c++11 seed member function in a loop is really, really slow. 这里有两个使用两种方法的地形(具有相同的 我试图实现一个简单的噪声函数,它接受两个整数,并根据种子结合两个参数返回一个随机浮点数.

使用std :: mt19937效果很好,但出于某种原因,当我尝试使用带有rand()的srand时,我得到重复的数字..

Note: Using c++11 seed member function in a loop is really,really slow.

这里有两个使用两种方法的地形(具有相同的重播号码):

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);}

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;}

对于问题:

>有没有更快的方法来重新设置c 11伪随机数?
>为什么srand不按预期工作?

提前致谢.

编辑:
好抱歉不清楚,而且,我知道也许我错了但让我尝试再次解释,我使用重播,因为我在迭代时使用相同的x和z坐标(不是相同的迭代).

如果我删除重播,我会得到这个结果:

解决方法

I am trying to implement a simple noise function that takes two integers and return a random float based on the seed combined with the two parameters.

Please don’t say I shouldn’t reseeding,I want to reseed on purpose.

你故意打破它,并问我们为什么它被打破,但需要注意的是我们不允许在房间里提到大猩猩.

不要重新种植.

[编辑]
好的,根据评论请求,这是一个答案:

1)不,没有更快的方法来重新安装PRNG,你不应该这样做.适当地,你应该播种,然后通过丢弃几千个值来“升温”PRNG.

2)rand()(以及,即使你不相信它,你使用的任何其他PRNG)不起作用的原因是因为你的getNoise()函数不正确.

你的第三张图片是正确的.只需返回一个钳位的随机值就可以得到这个结果.

您试图通过弄乱种子来调制它,并且由于您在第一次尝试时表现出明显的视觉效果,因此得出结论认为这是正确的方法.然而,真正发生的事情是你只是削弱了PRNG并看到了结果. (在rand()尝试中更清楚,因为它的种子更粗略地定义了结果序列,它本身的周期比Mersenne Twister小.)

(尝试通过倾斜(x,z)坐标来修改它也是一个红色鲱鱼.它不会影响输出的实际随机性.)

TL; DR
你这样做是错的.

如果你想生成地形图,你应该围绕分形地形生成谷歌.事实上,这里有一个不错的链接:http://www.gameprogrammer.com/fractal.html

你会发现它需要做更多的工作,但这些方法非常简单,你可以很容易地调整它们来修改你的结果.

希望这可以帮助.

总结

以上是内存溢出为你收集整理的重新种植std :: rand / c 11全部内容,希望文章能够帮你解决重新种植std :: rand / c 11所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存