我正在实现一个单层感知器,我的随机函数有一个问题,例如每次调用该函数时它都会生成 0。因此,我在计算激活时得到了不准确的结果。这是我的随机函数的片段:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
//Helper function to generate a random number between 0 and 1
double weight_coef() {
//((double)rand() / RAND_MAX);
srand(time(NULL));
double random = static_cast<double>(rand() / RAND_MAX);
random = round(random * 100) / 100.0; //to 2 dec points
return random;
}
int main() {
// Set up the variables
vector<double> w = { weight_coef(), weight_coef(), weight_coef()};
}
如果您能提出问题所在,将不胜感激。
std::rand
返回一个保证在0和RAND_MAX
之间的整数。因此权重系数代码
double weight_coef() {
srand(time(NULL));
double random = static_cast<double>(rand() / RAND_MAX); // <-- LOOK
/* The above line will always set random to 0 */
random = round(random * 100) / 100.0;
return random;
}
将始终返回 0(实际上它 几乎 总是 0,并且以
1/RAND_MAX
的概率为 1)。一种解决方案是采用随机整数,将其取模 100,然后将其解释为两位小数的概率。但请注意,这会稍微不均匀,因为RAND_MAX
可能不能被 100 整除(并且可能是 2^31 - 1 = 2147483647)。
如果你想做一个统一的随机变量,你可以这样做
#include <iostream>
#include <random>
const int LOWER_BOUND = 0;
const int UPPER_BOUND = 100;
std::random_device rand_dev;
std::mt19937 gen;
std::uniform_int_distribution<int> dist;
int random_int() {
return dist(gen);
}
int main()
{
gen = std::mt19937(rand_dev());
dist = std::uniform_int_distribution<int>(LOWER_BOUND, UPPER_BOUND);
for (int i = 0; i < 10; i++) {
std::cout << random_int() << "\n"; // generate 10 random integers
}
}
我注意到在每次函数调用时重复重新初始化种子也不是一个好主意。相反,设置一次种子 - 可能在 main 中(如我发布的代码片段中隐式完成的那样)。