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中。
我不明白,爲什麼非要在每一個循環的種子。一般來說,當你啓動你的程序時,你只需要設置種子一次。 – Caduchon
我想代碼爲每個循環使用不同的種子。 – mardok
當您在每次運行中設置相同的種子時,它不是隨機的!然後我不明白你想做什麼。我知道在一個循環中設置種子的唯一原因是在多線程架構中的可重現性。在這裏似乎並不是這樣。 – Caduchon