【发布时间】:2016-07-03 17:41:40
【问题描述】:
我正在尝试实现一个简单的噪声函数,它接受两个整数并根据种子和两个参数的组合返回一个随机浮点数。
使用std::mt19937 效果很好,但由于某种原因,当我尝试将srand 与rand() 一起使用时,我得到重复的数字..
注意:在循环中使用 c++11
seed成员函数非常非常慢。
这里有两个使用两种方法的地形(具有相同的重新播种数):
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 坐标(不是相同的迭代)。
【问题讨论】:
-
您正在根据
x、z和seed重新播种...如果这些值相同,您的种子也会...所以您会得到来自rand()的相同号码。 -
"我得到重复的数字.. [暗示那些是不需要的]" vs "我不想得到一个完全随机的数字" => 选择一个。你意识到这些是相互排斥的,对吧?如果你想要一些半随机的东西,那么定义一个合适的分布。不要只是试图用你想到的第一个 hack 来让 RNG 变得“不那么随意”。
-
也许如果您不想要完全随机分布,您应该设置限制并应用随机数来获得变化。
-
我可能弄错了,但在我看来,您似乎找到了一种减少一台发电机的“随机性”的万能方法,您想知道为什么您的万能方法对不同的发电机。我认为你将不得不重新设计你的算法以依赖实际的随机性,而不是试图将适量的秩序强加给混乱。
-
@NaorHadar 是的,您需要使用与您想要查看的结果类型相匹配的分布和后续处理,同时仍提供足够的随机性以引起兴趣。在不同的 stdlibs/runtimes 和诸如此类的东西之间进行重新播种等不太可能是可靠的,因此您需要找出一种方法。有利的一面是,您可以更好地控制您将获得的输出类型。