1

我试图洗牌,但 random_shuffle 每次都会产生相同的结果

void
Deck::shuffle() {

    cout << "SHUFFLING CARDS!!!\n\n";

    srand(time(0));
    random_shuffle(cards.begin(), cards.end());

    displayCards();
}
4

5 回答 5

5

那是因为您每次将伪随机数生成器播种到相同的值:

srand(time(0));

time如果我没记错的话,粒度是秒。如果您在两次调用之间暂停执行一段时间,Deck::shuffle()您应该会看到不同的结果。

从函数中删除该行并在程序开始时调用它一次。

于 2013-08-16T17:09:09.980 回答
1

每次调用时,您都在重新播种随机数生成器shuffle

每个应用程序只应为随机数生成器播种一次(通常在应用程序初始化中):

int main()
{
    // other initialization
    srand(time(NULL)); // seed the number generator

    // ...
}
于 2013-08-16T17:41:13.217 回答
1

我认为问题在于您将其放入srand(...)函数内部。

尝试将它移到外面(这样它只会执行一次)

于 2013-08-16T17:10:55.780 回答
0

我不熟悉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;

        }
}
于 2013-08-16T17:21:55.917 回答
0

重要的是要知道,为了能够接收“随机”数字,您必须为生成器播种。它也应该在函数之外播种。

srand(time(NULL));

使用时间功能将有助于确保您将收到一个随机数。

确实需要包含 time.h 才能使其工作。有关 srand 的更多参考,请单击此处

于 2013-08-16T17:14:18.057 回答