C++ 随机套牌问题

C++ Shuffle Deck Issue

本文关键字:问题 随机 C++      更新时间:2023-10-16

我在C++中洗牌时遇到问题。我有一副纸牌课。在类中,我有一个对象向量,它们是套牌中的牌,我正在尝试洗牌量中的元素以洗牌。但是,我编写的函数似乎只是在每次迭代中移动所有内容,而不是将其与向量中的另一个随机元素交换。我确信我错过了一些非常简单和愚蠢的东西,但我只是还无法弄清楚。任何帮助将不胜感激。谢谢。

void shuffle(int seed = 0)
{
    for (int i = 0; i < 100; i += 1)
    {
        for (unsigned int i = 0; i < deck.size(); i++)
        {
            card *swap = deck[i];
            srand(time(NULL) + seed);
            int temp = rand() % 52;
            deck[i] = deck[temp];
            deck[temp] = swap;
        }
        cout << "shuffled deck: ";
        for (unsigned int i = 0; i < deck.size(); i++)
            cout << deck[i]->compare() << " ";
        cout << endl;
    }
}

这是在我制作的概率函数中调用的,在一个循环中。随机函数的种子是循环的迭代。

这是一次迭代中部分输出的示例

只需初始化一次 RNG,例如在 main() 函数中

    srand(time(NULL));

然后,最简单的洗牌方法之一是将每个项目从末尾交换到开头,并用前面的随机元素交换。请注意,要交换的物品可以与要交换的物品相同 - 这样物品也可以留在原地。

void shuffle()
{
    for (int i = 0; i < 100; i ++)
    {
        for (unsigned int n = deck.size(); n > 1; --n)
        {
            unsigned swapPosition = rand() % n;
            card *swap = deck[n-1];
            deck[n-1] = deck[swapPosition];
            deck[swapPosition] = swap;
        }
        cout << "shuffled deck: ";
        for (unsigned int n = 0; n < deck.size(); n++)
            cout << deck[n]->compare() << " ";
        cout << endl;
    }
}