使用std :: random_device的随机扑克牌组

时间:2016-05-04 23:16:23

标签: c++ c++11 random

我试图改变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";

2 个答案:

答案 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));设置种子。这允许每次都有一个独特的序列。