为什么我的随机函数每次在循环中调用它时都会生成相同的数字?
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。
我的随机函数生成范围内的伪随机数:
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。