c++ 为什么std::兰德总是生成0?

uqjltbpv  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(164)

我正在实现一个单层感知器,我的随机函数有一个问题,比如每次调用函数时它都会生成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()};
}

如果你能告诉我出了什么问题,我会很感激的。

y4ekin9u

y4ekin9u1#

问题是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中(就像我发布的代码片段中隐式地完成的那样)。

相关问题