【问题标题】:Shuffle deck of cards using std::random_device [duplicate]使用 std::random_device 洗牌
【发布时间】:2016-08-30 14:19:46
【问题描述】:

我正在尝试改组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";

【问题讨论】:

  • 因缺乏研究努力而被否决。人们几乎无法阅读任何有关 smth 的文档。喜欢 mt19937 却不知道这里出了什么问题,并且搜索 "Seed mt19937 C++" 在每个搜索引擎中也能得到不错的结果。
  • 我正在为 mt19937 播种不同的整数,看看是否有任何变化。我不小心在这里发布了该代码。我已经通过使用 rd 播种 mt19937 来修复代码,这是预期的实现。 std::random_device 不是随机种子吗?
  • 这甚至不能编译。不,std::random_device 不是种子,尽管它可以用来获取种子。请去阅读一些docs
  • 我很抱歉在 rd 之后省略了左括号和右括号。它现在应该编译。我还必须承认我已经看过那个链接,但仍然有点困惑,所以我想我会在这里问,因为人们通常都很乐于助人。通常。
  • 你的系统是什么? MinGW 的 random_device 已知已损坏。

标签: c++ c++11 random


【解决方案1】:

我决定采用以下解决方案,因为它满足我的一般要求。

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

【讨论】:

    【解决方案2】:

    您使用的是相同的简单种子。阅读如何正确播种 PRNG:How to properly seed a mersenne twister RNG?

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 2012-08-02
      • 2012-09-01
      • 1970-01-01
      • 2017-06-28
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多