随机生成器帮助 C++

Random Generator Help C++

我在使用随机生成器时遇到问题。 我试图打印出随机值,但每次都得到几乎相同的值。

这是我的:

void Deck::shuffle() {
    StackNode<Card>* top = stack->top;

    for (int i = 0; i < stack->numNodes - 1; i++) {
        int x = random(i);
        StackNode<Card>* temp = findCard(x);
        //cout << "Random index was: " << random(i) << endl;
        //cout << "Face value of random was: " << temp->data.getFaceVal() << endl;
        cout << "Top: " << top->data.getFaceVal() << endl;
        cout << "Temp: " << temp->data.getFaceVal() << endl;
        swapX(top,temp);
    }
}

这是我的随机生成器函数:

int random(int index) {
    int r;
    srand(time(NULL));
    cout << "Index: " << index << endl;
    r = rand() % 50;
    cout << "Random value: " << r << endl;
    return r;
}

我想你可以在这里使用 std::shuffle 来解决你的问题。像这样:

   #include <vector>
   #include <algorithm>

    void Deck::shuffle() {
        StackNode<Card>* top = stack->top;

        std::vector<StackNode<Card>*> cards;

        for (int i = 0; i < stack->numNodes - 1; i++) {
            cards.push_back(findCard(i))
        }

        std::shuffle(cards.begin(), cards.end());

        for (auto card : cards) {
            std::cout << card->data.getFaceVal() << std::endl;
        }
    }

顺便说一下,我建议您在代码中只调用一次 srand

rand() 是一个伪随机数生成器。它生成的数字看起来是随机的,但它们是由一个完全确定的函数生成的。你用 sand() 给它的种子决定了函数的起点。如果你给它相同的种子,它会生成相同的随机数序列。您可以尝试这个并通过使用文字播种来亲自查看,例如 srand(200) 和 运行 程序多次,您将获得完全相同的结果。

如果你每次都想要不同的结果,你必须用每次程序运行时都会不同的东西来播种,所以时间通常被用作种子。在您的情况下,您处于一个非常紧密的循环中,因此连续的许多调用都使用相同的时间值。

如果你调用 srand() 一次,在你的循环之前这个问题就会消失。