我正在調用newSeed()和rand()類的Random靜態成員函數。 newSeed()提供了Random類的靜態成員(我們稱之爲種子)。更具體的,我並行調用該函數在另一個類,方法類:靜態成員和多線程
double* Method::randomPoint(double* bottom_, double* top_)
{
try{
Random generator_ ;
double* pt_ = new double[m_ndim];
generator_.newSeed();
for(int i=0;i<m_ndim;i++)
{
pt_[i]= generator_.rand(bottom_[i],top_[i]);
}
return pt_;
}
catch(...)
{
return NULL;
}
}
綜上所述,在每個並行調用,我創建Random類的新實例,我叫newSeed()和rand()方法在這個對象中。由於在給定的實例上調用newSeed(),我希望newSeed()初始化此對象的種子成員 - 因此僅針對此線程。由於種子是靜態的,並且newSeed()也是靜態的,我是否正在爲所有當前正在運行的Random類(以及所有線程)的實例修改種子?
請告訴我,如果問題必須澄清。
感謝和問候。
如果newSeed是一個靜態方法,它將改變所有線程的種子。你只應該種一次PRNG,不需要多次。 – 2012-04-10 07:12:49
沒有看到Random類的定義很難說。你說這些方法是靜態的,所以沒關係它是每個線程上的一個新實例,但是可能存在用於種子的線程本地存儲,所以它可能每個線程都不相同。不發佈隨機類的代碼,你不能得到明確的答案。 – 2012-04-10 07:15:44