C ++卡片洗牌功能

时间:2015-01-03 21:04:17

标签: c++ class random playing-cards

我正在尝试使用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;
    }
}

我做错了吗?为什么我应该随机获得相同的结果?感谢。

4 个答案:

答案 0 :(得分:5)

假设您可以使用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);

答案 1 :(得分:3)

您的代码在随机性方面存在一些问题:

答案 2 :(得分:1)

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

srand(time(NULL));

答案 3 :(得分:-1)

rand()方法,如果没有初始化,则返回相同的&#34;随机&#34;数。您必须使用函数srand()初始化数字生成的起始点。 此函数采用允许生成不同数字的参数。 把这一行

srand(time(0));
在rand函数之前

你将拥有不同的数字。 (时间(0)是系统时间。你可以在这里输入一个像100这样的数字,但你总是会有相同的数字。时间(0)这个数字每次都会改变。)