{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 をシードするにはどうすればよいですか? (各呼び出しには独自のエンジンがあるため)
グローバル変数を使用して問題を回避できます。より良い解決策があるかどうか疑問に思っていました。ありがとう!