为什么我的随机函数每次在循环中调用它时都会生成相同的数字?

Why does my random function generate the same number every time I call it in a loop?

我的随机函数生成范围内的伪随机数:

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]

我假设您是从另一个函数 main 或 else 调用 randomNumber 函数。

如果您在函数内声明种子,您将重置该函数。 重置该功能会使相同的数字出现多次,同一秒。

srand(time(nullptr)); 移动到主函数应该可以解决问题。

时间紧迫的重复播种每次都会产生相同的初始结果after-seed。如果由于调用方位置的原因每个进程播种一次不是一个选项,那么您应该提供一个初始 static-state 来代替。 可能对你有用的是:

#include <random>

double Utils::randomNumber(int min, int max)
{
    static std::mt19937 rng{ std::random_device{}() };
    std::uniform_real_distribution<double> dist(min, max);
    return dist(rng);
}

请注意,统一实际范围的潜在上限存在内在问题,它可能适用于您的使用(不太可能,但永不言败)。有关详细信息,请参阅注释 here