2015-06-15 47 views
0

我想更改rand_r方法的使用方法srand/rand或與其他具有種子的隨機生成器一起使用。將rand_r更改爲srand/rand

在代碼中有一個循環調用帶種子的列車方法。

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

火車方法有3呼籲rand_r,我想改變。我想我可以打電話給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

我不明白,爲什麼非要在每一個循環的種子。一般來說,當你啓動你的程序時,你只需要設置種子一次。 – Caduchon

+0

我想代碼爲每個循環使用不同的種子。 – mardok

+0

當您在每次運行中設置相同的種子時,它不是隨機的!然後我不明白你想做什麼。我知道在一個循環中設置種子的唯一原因是在多線程架構中的可重現性。在這裏似乎並不是這樣。 – Caduchon

回答

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);