使用random_shuffle,多个类的向量未按预期进行混合

时间:2018-08-30 01:12:05

标签: c++ vector

决定使用向量和Card类在C ++中创建卡片组。我之所以选择它,是因为使用random_shuffle进行混洗很容易。我的第一种方法是使用C ++来获取水印,我制作了一个卡片列表,使用矢量生成数字并对其进行洗牌,只是将卡片插入tmp列表中并返回。至少可以这么说。

因此,在第二个分支上,我尝试从一开始就使用矢量进行处理,如下所示:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

// Represent a card
class Card
{
private:
  int suit;
  int value;

public:
  Card(){}

  Card(int v, int s)
  {
    suit = s;
    value = v;
  }

  void
  setNewVals(int v, int s)
  {
    value = v;
    suit = s;
  }

  int
  getValue()
  {
    return value;
  }

  int
  getSuit()
  {
    return suit;
  }
};

// Shuffle deck
void
shuffleDeck(vector<Card> *c, int shuffles)
{
  for(int s = 0; s < shuffles; s++)
    {
      random_shuffle(c->begin(), c->end());
    }
}

int
main()
{
  //TODO: Later input from main
  int numDecks = 10;
  int numShuffles = 10;

  // Create a deck vector
  vector<Card> c;

  // Select card's value
  for(int d = 0; d < numDecks; d++)
    {
      for(int v = 1; v < 14; v++)
        {
          // Select card's suit
          for(int s = 0; s < 4; s++)
            {
              Card card(v, s);
              c.push_back(card);
            }
        }
    }

  // Shuffle the deck
  shuffleDeck(&c, numShuffles);

  // Print out first 52 cards
  for(int i = 0; i < 52; i++)
    {
      Card aCard = c.front();
      cout << aCard.getValue() << "\t" << aCard.getSuit() << endl;
      c.erase(c.begin());
    }

  return 0;
}

问题在于,现在random_shuffle确实无法按预期工作。它可以随机播放,但是所有卡总是以相同顺序结束。当我使用int进行几乎完全相同的操作时,它工作正常。

我真的不知道为什么它不会一直随机播放。我是否误解了向量的工作原理?

2 个答案:

答案 0 :(得分:3)

您应该看到http://www.cplusplus.com/reference/algorithm/random_shuffle/链接。

std::random_shuffle()的随机性似乎取决于std::srand函数。

因此,您应该编写如下代码(这只是一个示例)

  #include <iostream>
  #include <algorithm>
  #include <vector>
  #include <ctime>
  ...
  int main() {
      ...
      // Make randomness for shuffle
      std::srand(unsigned(std::time(0)));

      // Shuffle the deck
      shuffleDeck(&c, numShuffles);
      ...
  }

答案 1 :(得分:2)

为了使std::random_shuffle在不同的运行中返回不同的值,需要给它一个non-fixed seed

您可以通过添加以下行来解决此问题:

std::srand(std::time(NULL));

现在至少间隔1秒执行一次,将产生不同的混洗结果。