【发布时间】:2022-01-25 23:53:15
【问题描述】:
我的随机函数在该范围内生成一个伪随机数:
double Utils::randomNumber(int min, int max)
{
assert(min < max);
srand(time(nullptr));
return (max - min) * ((double)rand() / RAND_MAX) + min;
}
但是,当我在循环中调用它时,我总是得到相同的数字,尽管我为序列设定种子:
for (int i = 0; i < m_inputs; ++i)
{
m_weights.push_back(Utils::randomNumber(0, 1));
}
输出:
Weights: [0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561, 0.787561]
【问题讨论】:
-
srand(time(nullptr));应该在进程的生命周期内调用一次;不是功能。它不属于你拥有它的地方。坦率地说,无论如何你都应该使用<random>的产品。 -
@WhozCraig,好吧,但是有没有一种优雅的方法可以做到这一点,因为我正在编写一个库,所以我需要这个函数。
-
您每次都从头开始播种随机数生成器,并且由于循环很紧
time(nullptr)在迭代之间不会发生变化,因此您最终会得到相同的数字。 -
@CuriousPanCake 你需要一个静态变量。
-
不知道你为什么要公开它。对于所有意图,您似乎想要
std::uniform_real_distribution已经提供的东西。
标签: c++ random random-seed