【问题标题】:C++ Deck Of Cards Shuffling FunctionsC++ 纸牌洗牌函数
【发布时间】:2015-03-01 19:24:48
【问题描述】:

我正在尝试使用 C++ 构建扑克游戏。洗牌功能给我带来了一些问题。每次我运行初始化牌组的程序,洗牌,然后打印牌组时,我都会得到相同的输出:

Shuffling the cards and dealing...
Printing deck...
KD
6S
7D
QD
5C
JH
9S
6D
7H
JD
QH
3C
7S
3H
TC
5D
5S
3D
AD
7C
4H
6H
JC
TS
4D
JS
QC
AH
9C
2D
5H
8C
TD
4S
2S
KS
2C
8D
KC
2H
9H
6C
KH
3S
QS
8S
8H
4C
AS
AC
9D
TH

使用 Deck 和 Card 类,我的相关函数定义如下:

Deck::Deck(){
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 13; j++) {
            cards[i * 13 + j].suit = i;
            cards[i * 13 + j].rank = j;
        }
    }
    Card::suits[0] = "D";
    Card::suits[1] = "S";
    Card::suits[2] = "H";
    Card::suits[3] = "C";
    Card::ranks[0] = "2";
    Card::ranks[1] = "3";
    Card::ranks[2] = "4";
    Card::ranks[3] = "5";
    Card::ranks[4] = "6";
    Card::ranks[5] = "7";
    Card::ranks[6] = "8";
    Card::ranks[7] = "9";
    Card::ranks[8] = "T";
    Card::ranks[9] = "J";
    Card::ranks[10] = "Q";
    Card::ranks[11] = "K";
    Card::ranks[12] = "A";
}

void Deck::print(){
    cout << "Printing deck..." << std::endl;
    for (int i = 0; i < 52; i++) {
        cout << Card::ranks[cards[i].rank] << Card::suits[cards[i].suit] << endl;
    }
    cout << endl;
}

void Deck::shuffle(){
    top = 51;
    int x;
    Card tempCard;
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 13; j++) {
            cards[i * 13 + j].suit = i;
            cards[i * 13 + j].rank = j;
        }
    }
    cout << "Shuffling the cards and dealing..." << endl;
    for (int i = 0; i < 52; i++) {
        x = rand() % 52;
        tempCard = cards[i];
        cards[i] = cards[x];
        cards[x] = tempCard;
    }
}

我做错了什么吗?为什么当它应该是随机的时我总是得到相同的结果?谢谢。

【问题讨论】:

  • 试试这个,只需编写一个 c/c++ 程序,它会执行 cout
  • 我认为你是最近几天出现的第 5 个与 C++ 和扑克有关的问题的家伙。这是学校的工作吗?

标签: c++ class random playing-cards


【解决方案1】:

假设你可以使用 C++11 的特性,你可以使用这个(取自https://stackoverflow.com/a/19728404/341065):

#include <random>

std::random_device rd;     // only used once to initialise engine
std::mt19937 rng(rd);      // random-number engine used
std::uniform_int_distribution<int> uni(min,max); // guaranteed unbiased

auto random_integer = uni(rng);

【讨论】:

  • 我的答案更像是一个最小的修复,但这个答案是一个更好的方法。还要注意,std::random_device 在几乎所有实现中都应该提供比srand(time(NULL)) 更好的熵。
【解决方案2】:

您的代码在随机性方面存在几个问题:

【讨论】:

    【解决方案3】:

    您需要为随机数生成器播种。在程序开始时专门调用一次srand()。一种常见的方法是:

    srand(time(NULL));
    

    【讨论】:

      【解决方案4】:

      rand() 方法,如果未初始化,则始终返回相同的“随机”数字。您必须使用函数 srand() 初始化数字生成的起点。 此函数采用允许生成不同数字的参数。 放这一行

      srand(time(0));
      

      在 rand 函数之前,你总是会有不同的数字。 (time(0) 是系统时间。您可以在此处输入一个数字,例如 100,但您将始终拥有相同的数字。使用 time(0),数字每次都会改变)。

      【讨论】:

      • 我不确定这是否是您的答案被否决的原因,但您可能想澄清一下,您应该在致电 rand() 之前仅致电 srand(time(0)) 一次,而不是每次。
      • 它可能被否决了,因为“rand() 方法,如果没有初始化,总是返回相同的‘随机’数” 可以解释为意味着rand() 有每次调用时都会得到相同的结果,如果所述调用前面没有一个到srand()。在这种情况下,最好讨论一个调用序列将如何产生相同的结果序列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多