我试图洗牌,但 random_shuffle 每次都会产生相同的结果
void
Deck::shuffle() {
cout << "SHUFFLING CARDS!!!\n\n";
srand(time(0));
random_shuffle(cards.begin(), cards.end());
displayCards();
}
那是因为您每次将伪随机数生成器播种到相同的值:
srand(time(0));
time
如果我没记错的话,粒度是秒。如果您在两次调用之间暂停执行一段时间,Deck::shuffle()
您应该会看到不同的结果。
从函数中删除该行并在程序开始时调用它一次。
每次调用时,您都在重新播种随机数生成器shuffle
。
每个应用程序只应为随机数生成器播种一次(通常在应用程序初始化中):
int main()
{
// other initialization
srand(time(NULL)); // seed the number generator
// ...
}
我认为问题在于您将其放入srand(...)
函数内部。
尝试将它移到外面(这样它只会执行一次)
我不熟悉random_shuffle
,但这是一个完美的洗牌功能 - 换句话说,每个 52!甲板的排列必须同样可能。
这是来自 Gayle Laakmann 的破解编码采访(问题 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;
}
}
重要的是要知道,为了能够接收“随机”数字,您必须为生成器播种。它也应该在函数之外播种。
srand(time(NULL));
使用时间功能将有助于确保您将收到一个随机数。
确实需要包含 time.h 才能使其工作。有关 srand 的更多参考,请单击此处。