来自大群体的随机样本进入无限循环
Random sample from a large population runs into infinite loop
我想从一个相对较大的群体中抽取n个样本,而不需要替换。所以我画随机数,并跟踪我以前的选择,这样每当我画两次数字时,我都可以重新采样:
boost::mt19937 generator;
boost::uniform_int<> distribution(0, 1669 - 1);
boost::variate_generator<boost::mt19937, boost::uniform_int<> >
gen(generator, distribution);
int n = 100;
std::vector<int> idxs;
while(static_cast<int>(idxs.size()) < n)
{
// get random samples
std::generate_n(std::back_inserter(idxs), n - idxs.size(),
gen);
// remove duplicates
// keep everything that's not duplicates to save time
std::sort(idxs.begin(), idxs.end());
std::vector<int>::iterator it = std::unique(idxs.begin(), idxs.end());
idxs.resize(std::distance(idxs.begin(), it));
}
不幸的是,对于上面使用的常量,我遇到了一个无限循环。
我添加了一些输出(这表明它一直在选择相同的数字),并在10次尝试后停止显示问题:
boost::mt19937 generator;
boost::uniform_int<> distribution(0, 1669 - 1);
boost::variate_generator<boost::mt19937, boost::uniform_int<> >
gen(generator, distribution);
int n = 100;
int repeat = 0;
std::vector<int> idxs;
while(static_cast<int>(idxs.size()) < n)
{
if(repeat++ > 10) break;
cout << "repeat " << repeat <<
", " << idxs.size() << " elements" << endl;
std::generate_n(std::back_inserter(idxs), n - idxs.size(),
gen);
cout << "last " << idxs.back() << endl;
std::sort(idxs.begin(), idxs.end());
std::vector<int>::iterator it = std::unique(idxs.begin(), idxs.end());
idxs.resize(std::distance(idxs.begin(), it));
}
代码打印
repeat 1, 0 elements
last 1347
repeat 2, 99 elements
last 1359
repeat 3, 99 elements
last 1359
等等,如果我不终止程序,这似乎会永远循环。这不应该发生,对吧?我只是运气不好吗?还是我做错了什么?
短期解决方案感谢@jxh!使用参考资料有助于:
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
gen(generator, distribution);
问题是generate_n
创建了您创建的生成器gen
的副本。因此,在对generate_n
的调用结束时,gen
的状态不变。因此,每次重新循环时,都会再次生成相同的序列。
解决此问题的一种方法是在variate_generator
:*中使用对随机数生成器对象的引用
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
gen(generator, distribution);
*由于我对Boost的经验有限,我最初的建议相当笨拙。我已经采用了提问者在这个答案中实现的解决方案
相关文章:
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 来自大群体的随机样本进入无限循环