C++ 随机洗牌似乎产生相同的结果,但仅在前两种情况下。我如何避免这种情况?

C++ 随机洗牌似乎产生相同的结果,但仅在前两种情况下。我如何避免这种情况?,c++,random,shuffle,random-seed,C++,Random,Shuffle,Random Seed,我必须为课堂编写一个blacjack游戏。除了在初始化游戏时洗牌(抽出前两张牌)外,一切似乎都很正常。从那时起,一切似乎都是随机的 我将提供所有必要的代码。我正在使用的randomWithLimits函数: int randomWithLimits(int upperLimit, int lowerLimit) { return (std::rand() % (upperLimit - lowerLimit + 1) + lowerLimit); } 很简单,它是在主体中播种的,如下所

我必须为课堂编写一个blacjack游戏。除了在初始化游戏时洗牌(抽出前两张牌)外,一切似乎都很正常。从那时起,一切似乎都是随机的

我将提供所有必要的代码。我正在使用的randomWithLimits函数:

int randomWithLimits(int upperLimit, int lowerLimit)
{
    return (std::rand() % (upperLimit - lowerLimit + 1) + lowerLimit);
}
很简单,它是在主体中播种的,如下所示:

int main()
{
    srand(time(nullptr));
    Blackjack bj;
    bool play = true;
    while (play == true) play = bj.playGame();
    return 0;
}
21点功能本身相当长,但有一部分无法正常工作(第一轮):

这不是什么大问题,但它仍然困扰着我。每当我第一次编译和运行该函数时,第一个输出总是:

The dealer shuffles the deck

You drew a Two of Clubs.
The dealer drew a card.

You drew a Four of Clubs.
The dealer drew a card.
Your hand is currently 6.
从那时起,每张牌似乎都是随机的。 抽卡功能:

Card CardDeck::drawCard() {
    currentCardIndex++;
    return cards[currentCardIndex - 1];
}
drawInitialCards功能:

Card CardDeck::drawCard() {
    currentCardIndex++;
    return cards[currentCardIndex - 1];
}
void Blackjack::drawInitialCards() {
    Card card = deck.drawCard();
    std::cout << "\nYou drew a " << card.toString() << ".";
    playerHand = getPlayerCardValue(&card);
    card = deck.drawCard();
    std::cout << "\nThe dealer drew a card.";
    dealerHand = getDealerCardValue(&card, dealerHand);
    card = deck.drawCard();
    std::cout << "\n\nYou drew a " << card.toString() << ".";
    playerHand += getPlayerCardValue(&card);
    card = deck.drawCard();
    std::cout << "\nThe dealer drew a card.";
    dealerHand += getDealerCardValue(&card, dealerHand);
}
void Blackjack::drawInitialCards(){
卡片=卡片组.抽卡();

std::cout发现了错误。这

bool Blackjack::playGame() {
    CardDeck deck = CardDeck();
应该简单地写出来

bool Blackjack::playGame() {
    deck = CardDeck();

看起来我像我想的那样创建了一副新牌。

因为你生成的第一张牌实际上是梅花,从两张梅花开始,看起来洗牌实际上并没有触及牌组的顶部牌

你当前的代码不能保证洗牌时每张牌都会被击中。与其对一对随机牌进行100次洗牌,不如尝试在从牌0到牌51的循环中用随机牌交换每张牌

void CardDeck::shuffle() {

    for(int a = 0; a < 52; a++) {
        int b = randomWithLimits(51, 0);
        swap(a, b);
    }
}
void CardDeck::shuffle(){
对于(int a=0;a<52;a++){
int b=具有限制的随机数(51,0);
掉期(a、b);
}
}

这应该确保洗牌时每张牌都被碰过,并且每个位置持有任何牌的可能性都相等。在您以前的系统中,并非所有牌都会被洗牌的可能性很高。

在我看来,您的洗牌功能相当弱……请尝试std实现:我知道它相当弱,但它确实有效在测试洗牌函数时有效。在测试了一点之后,drawInitialCards函数似乎完全是从另一副牌中抽取的(就我所测试的而言,它总是相同的,并且总是返回偶数的梅花牌)。如何实现
getPlayerCardValue()
看起来像?除了
Blackjack::drawInitialCards()
函数之外,您是否在其他任何地方使用它?发现错误后,在playGame()中使用了getPlayerCardValue()。我只是不得不在卡片组前面移除卡片组,因为我最终以这种方式创建了另一个卡片组。这对你很好,下次在询问之前尝试调试;)谢谢,看起来确实更好。是的。这不是错误,但你的代码仍然比lol+1好,但是Fisher-Yates将是更好的解决方案……Fisher-Yates是一个更通用的解决方案,b但是上面的解决方案不应该产生有偏差的结果。它只命中每个位置一次,然后将其与牌组中任何可能的牌交换。这种方法可能比重新创建一个完整的牌组更快。
bool Blackjack::playGame() {
    CardDeck deck = CardDeck();
bool Blackjack::playGame() {
    deck = CardDeck();
void CardDeck::shuffle() {

    for(int a = 0; a < 52; a++) {
        int b = randomWithLimits(51, 0);
        swap(a, b);
    }
}