我寫這個短程序隨機選擇m個元素的子集出{1,...,N}的 -如何種子遞歸C++函數
std::set<int> randSubSet(int n, int m){
// generates a random subset of m elements from {1,...,n} uniformly
if (m>n) //check inputs validity
throw std::invalid_argument("m is larger then n.");
std::set<int> res{}; //initialize result set
if (m==n){ //easy case - the full set
for(int i = 1 ; i<n ; ++i)
res.insert(i);
}
std::mt19937 eng;
std::uniform_int_distribution<> uni(1,n);
if (m == 0){ // recursion base case
return res;
}
else {
res = randSubSet(n-1,m-1);
int i = uni(eng);
if (res.find(i) == res.end()) // if i isn't in S add it
res.insert(i);
else
res.insert(n); //else add n
}
return res;
}
由於主機不接種我總是得到相同的答案。我該如何種植這種仙人掌? (因爲每個電話都有自己的引擎)
我可以避免使用全局變量的問題,我想知道是否有更好的解決方案。謝謝!
使用一個靜態變量,並將其初始化爲'0'。每次輸入函數時,檢查它是否爲'0'。如果是,請將PRNG播種,並將值更改爲「1」。如果不是,則什麼都不要做。 –
使用一個靜態變量。 – atoMerz