我试图改变vector
的内容。排除vector
后,内容将被转移到队列中。队列代表卡片组。我遇到的问题是,即使我关闭程序,我也会不断收到相同的结果。实际上,即使在关闭IDE之后,我也会得到相同的序列。换句话说,卡片被洗牌一次并且无论如何都保持这种顺序。我之前尝试过使用这种随机化内容的新方法,并且不得不求助于旧方法。我希望能够一劳永逸地解决这个问题。如果没有办法实现这一点,我的下一个问题是如何在仍然使用std::shuffle
的同时随机化内容。我也尝试auto engine = std::default_random_engine{};
只获得相同的结果。谢谢。
std::vector<string> v;
map<string, int>::const_iterator iter;
for (iter = cards.begin(); iter != cards.end(); iter++) {
v.push_back(iter->first);
}
std::random_device rd;
std::mt19937 g(rd());
//auto engine = std::default_random_engine{};
std::shuffle(v.begin(), v.end(), g);
std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, " "));
std::cout << "\n";
答案 0 :(得分:1)
你正在使用相同的简单种子。阅读有关如何正确播种PRNG的信息:How to properly seed a mersenne twister RNG?
答案 1 :(得分:0)
我决定采用以下解决方案,因为它符合我的一般要求。
vector<string> vect;
map<string, int>::const_iterator imap;
for (imap = cards.begin(); imap != cards.end(); imap++) {
vect.push_back(imap->first);
}
srand(std::time(0));
random_shuffle(vect.begin(), vect.end());
vector<string>::const_iterator ivect = vect.begin();
while (ivect != vect.end()) {
deck.push(*ivect);
ivect++;
}
std::copy(vect.begin(), vect.end(), std::ostream_iterator<string>(std::cout, " "));
std::cout << "\n";
我在这里使用std::random_suffle
并使用srand(std::time(0));
设置种子。这允许每次都有一个独特的序列。