我试图改变一副牌,但random_shuffle每次产生相同的结果
void
Deck::shuffle() {
cout << "SHUFFLING CARDS!!!\n\n";
srand(time(0));
random_shuffle(cards.begin(), cards.end());
displayCards();
}
答案 0 :(得分:5)
这是因为你每次都将伪随机数生成器播种到相同的值:
srand(time(0));
time
的粒度是秒,如果我没有弄错的话。如果您在调用Deck::shuffle()
之间暂停执行一段时间,您会看到不同的结果。
从函数中删除该行,并在程序开始时调用它一次。
答案 1 :(得分:1)
我认为问题在于你将srand(...)
放在你的函数中。
尝试将其移到外面(这样它只会被执行一次)
答案 2 :(得分:1)
每次拨打shuffle
时,您都在重新播种随机数生成器。
每个应用程序只应为随机数生成器播种一次(通常在应用程序初始化中):
int main()
{
// other initialization
srand(time(NULL)); // seed the number generator
// ...
}
答案 3 :(得分:0)
重要的是要知道,为了能够接收“随机”数字,您必须为发电机播种。它也应该在功能之外播种。
srand(time(NULL));
使用时间功能有助于确保您收到随机数。
time.h确实需要包含才能工作。有关srand的更多参考,请单击here。
答案 4 :(得分:0)
我不熟悉random_shuffle
,但这里有一个完美的洗牌功能 - 换句话说,每个52!甲板的排列必须同样可能。
这是来自Gayle Laakmann的 Cracking the Coding Interview (问题20.2)
void Deck::shuffle() {
int temp, index;
for (int i = 0; i < cards.size(); i++){
index = (int) (rand() %(cards.size() - i)) + i;
temp = cards[i];
cards[i] = cards[index];
cards[index] = temp;
}
}