我编写了这个简短的程序来从 {1,...,n} 中随机选择 m 个元素的子集 -
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;
}
由于没有播种 eng,我总是得到相同的答案。我如何在这个场景中播种 eng?(因为每个调用都有自己的引擎)
我可以使用全局变量来避免这个问题,我想知道是否有更好的解决方案。谢谢!