将rand_r更改为srand / rand

时间:2015-06-15 08:18:09

标签: c++

我想更改 srand / rand rand_r 方法或使用带种子的其他随机生成器。

在代码中有一个循环,用种子调用 train 方法。

int nseeds = 5;
for (int seed = 0; seed < nseeds; seed ++)
{
    c.train(K, reps, gradientReps, improveReps, lambda, seed, SYMMETRICDIFF);
}

列车方法中,我想要更改 rand_r 的3次调用。我认为我可以在开始时使用给定的种子调用 srand ,然后只需要调用 rand()方法,但我不知道这是否是正确的方法。你觉得怎么样?

void Cluster::train(int K, int reps, int gradientReps, int improveReps, Scalar lambda, int seed, int whichLoss)
{
  unsigned int seed_ = seed;
  unsigned int* sptr = &seed_;
  //srand(seed);

  for (int rep = 0; rep < reps; rep ++)
  {
    for (int k = 0; k < K; k ++)
      if (rep == 0 or (int) chat[k].size() == 0 or (int) chat[k].size() == gd->nNodes)
      {
        for (int i = 0; i < gd->nNodes; i ++)
          if (rand_r(sptr) % 2 == 0) chat[k].insert(i);
        for (int i = 0; i < gd->nEdgeFeatures; i ++)
          theta[k*gd->nEdgeFeatures + i] = 0;

        theta[k*gd->nEdgeFeatures + rand_r(sptr)%gd->nEdgeFeatures] = 1.0;
      }

    for (int k = 0; k < K; k ++)
    {
      for (int o = 0; o < K; o ++)
      {
        int x1 = o;
        int x2 = rand_r(sptr) % K;
        // code
      }
    }
  }
}

source的链接。上面的代码在main.cpp和cluster.cpp中。

1 个答案:

答案 0 :(得分:2)

如果您的编译器支持C ++ 11,我会使用new random number library。如果没有,你应该尝试Boost random(它基本相同)。我建议使用mt19937随机数引擎,它可以生成质量非常好的随机数,而且速度也很快。

然后您的代码将如下所示:

std::mt19937 rng;
...
std::uniform_int_distribution dist(0, K - 1);
...
int x2 = dist(rng);