决定使用向量和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进行几乎完全相同的操作时,它工作正常。
我真的不知道为什么它不会一直随机播放。我是否误解了向量的工作原理?
答案 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秒执行一次,将产生不同的混洗结果。