2012-11-05 60 views
0

我是非常新的C++和我仍然没有把我的头围绕基本概念,但我的教授希望我们写一个算法来洗牌和显示一副牌,并且甲板需要被表示为二维数组。洗牌一副牌?

但是我只是在模拟一副扑克牌时遇到麻烦!

#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    vector<char> deck; 
    char suit[] = {'h','d','c','s'}; 
    char card[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; 
    for (int j=0; j<13; j++) { 
     for (int i=0; i<4; i++) { 
      deck.push_back(card[j] suit[i]); 
     }  
    } 

    return 0; 
} 

我已经看到了很多带班卡计划,但我什至不知道,如果我们要学习的这个学期。

+1

您可以将套装和价值结合到一个结构中。 – chris

+1

'deck.push_back(card [j] suit [i]);' - 你期望'card [j] suit [i]'是什么字符? –

+1

对于洗牌,我*会*推荐'std :: random_shuffle',但是这样做会失败。不过请记住,当你需要轻松地洗牌时,不要自己动手。 – chris

回答

0

正如评论中所建议的那样,您应该使用一个结构来表示一张卡片。见this article

对于洗牌算法,这里是一个提示:如果你可以洗牌一套n-1卡你可以洗牌一副牌吗?

+0

我们知道你可以洗牌一套牌。因此有可能洗牌(通过你的论点)n-1张牌。但是这个说法因为你无法洗牌而倒下了。 –

+0

你也可以洗牌一张牌。这是身份转换。仅仅因为它不喜欢随机播放并不会使它成为错误的定义。 – eh9

+0

事实上,我想到的算法已经在另一个答案中提供的[bames53](http://stackoverflow.com/users/365496/bames53)的评论中被提及。 –

0

为什么使它变得复杂?

一副牌包含52个元素。每个元素可以用两个字符表示。正如你在帖子中提到的诉讼和(为了一个更好的单词)号码。构建该数组。你不需要花费向量等。数组的大小是固定的。 52个项目,每个项目2个字符。

然后有一个循环运行,看起来像你希望的次数。

每次循环选择0-51之间的两个项目(记住在C++世界中的东西从零开始)。这两个数字是随机的(见rand)。交换它们(两个字符 - 或最好使用struct)。

+1

使用这种算法进行混洗,不可能保证每个置换具有相同的概率。结果实际上很大程度上取决于套牌中牌的初始顺序。 –

+0

@VincentNivoliers - 我很有兴趣看到这个陈述的数学证明。 –

+0

我的计算器说有8x10^67种可能性。那么为什么不生成所有这些选择一个。如果你洗牌一套牌,我也是这样做的(尽管有最初的订单),但是你的套牌与我的订单的顺序几乎是不可能的。 –

2

使用一个简单的结构,你可以编辑你的代码是这样的:

#include <iostream> 
#include <vector> 

using namespace std; 

struct Card { 
    char suit, number; 
    Card(char aSuit, char aNumber) : suit(aSuit), number(aNumber) { } 
}; 

int main() { 
    vector<Card> deck; 
    char suit[] = {'h','d','c','s'}; 
    char num[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; 
    for (int j=0; j<13; j++) { 
     for (int i=0; i<4; i++) { 
      deck.push_back(Card(suit[i], num[j]); 
     } 
    } 

    // now, deck[0] to deck[51] hold all the cards 
    // first card's suit is deck[0].suit, number is deck[0].number 

    return 0; 
} 
0

去阅读乔恩·本特利的编程珠玑。在第一章中有一个用于生成随机排列的算法。该算法以相同的可能性生成每个置换,而且,在阅读结束时,您会理解为什么。

他的算法对置换使用单个索引。在你的情况下,使用N = 52,并用(整数)商和你的两个指数产生除以4后的余数。商给你一个卡片指数;剩下的给你一套衣服。

+0

(是爱丁堡吗?) - 你见过达伦布朗(http://www.youtube.com/watch?v=GTEhOLDa7nQ)。几乎击败它。另外计算机只做一个随机的近似值。 –

+0

@EdHeal请阅读伪随机序列及其加密版本,理解为什么这个问题的“完美随机性”是一个红鲱鱼。 – eh9

+0

一个小问题 - 计算机(这是确定性的)能产生一个随机数吗?这不可以。这是确定性的。 –