C# “如何检测”;“手”;在抽牌游戏中

C# “如何检测”;“手”;在抽牌游戏中,c#,algorithm,probability,C#,Algorithm,Probability,具有一个数组,表示从一整副牌(52张牌)中选出的5张牌。 所以一只随机手看起来像这样['H3','H6','D3','D4','S4',(这里是H2对4和3)。 我正在寻找一种方法来了解随机5张卡的这些属性: 这是什么名字。i、 e:“四个一类”,“三个一类”等等 开 考虑到它是一只手,那只手的概率是多少 完全随机 我可以选择数据结构 我用c# 一旦考虑到存在基于价值的层次结构,识别手很容易。所以,尽管同花顺也是同花顺,满屋也是两对,但你总是会选择更值钱的分类 这意味着,如果你根据每手牌的标准

具有一个数组,表示从一整副牌(52张牌)中选出的5张牌。
所以一只随机手看起来像这样['H3','H6','D3','D4','S4',(这里是H2对4和3)。
我正在寻找一种方法来了解随机5张卡的这些属性:

  • 这是什么名字。i、 e:“四个一类”,“三个一类”等等 开
  • 考虑到它是一只手,那只手的概率是多少 完全随机
  • 我可以选择数据结构
  • 我用c#

一旦考虑到存在基于价值的层次结构,识别手很容易。所以,尽管同花顺也是同花顺,满屋也是两对,但你总是会选择更值钱的分类

这意味着,如果你根据每手牌的标准按价值降序检查你的五张牌,第一张匹配的牌将是正确的。(像a这样的东西在这里可能非常有用。)


至于概率,我只是想知道。(请注意,一副牌是52张,而不是54张。)

一旦考虑到有一个基于价值的层次结构,识别一手牌就很容易了。所以,尽管同花顺也是同花顺,满屋也是两对,但你总是会选择更值钱的分类

这意味着,如果你根据每手牌的标准按价值降序检查你的五张牌,第一张匹配的牌将是正确的。(像a这样的东西在这里可能非常有用。)


至于概率,我只是想知道。(请注意,一副牌是52张牌,而不是54张。)

关于每手牌的概率,这是一个简单的计数问题,考虑到有52张选择5=2598960张不同的手牌,因此您只需计算每种手牌的合格手数并将其除以2598960即可

例如,有4个不同的皇家冲水->4/2598960的概率=0.000153907%

有4*10=40个不同的直接刷新->40/2598960=0.00153907%的几率

有13*48=624个不同的四元组->624/2598960=0.024009603%的概率

等等

如果您不喜欢计算问题,您可以使用您的程序来枚举这2598960只手,并计算有多少次刷新、四边形等

关于检测手牌的代码-我将按排序顺序存储手牌(根据卡的等级/高度,忽略西装,即[H3'、'D3'、'D4'、'S4'、'H6'])。这将帮助您非常有效地检测成对、两对、三胞胎、四胞胎、满座和直线。
检测同花顺非常容易——只需检查五张牌是否来自同一套。你完了

关于拥有每只手的概率,这是一个简单的计数问题,考虑到有52只手选择5=2598960只不同的手,因此您只需计算每种手类型的合格手数并将其除以2598960即可

例如,有4个不同的皇家冲水->4/2598960的概率=0.000153907%

有4*10=40个不同的直接刷新->40/2598960=0.00153907%的几率

有13*48=624个不同的四元组->624/2598960=0.024009603%的概率

等等

如果您不喜欢计算问题,您可以使用您的程序来枚举这2598960只手,并计算有多少次刷新、四边形等

关于检测手牌的代码-我将按排序顺序存储手牌(根据卡的等级/高度,忽略西装,即[H3'、'D3'、'D4'、'S4'、'H6'])。这将帮助您非常有效地检测成对、两对、三胞胎、四胞胎、满座和直线。
检测同花顺非常容易——只需检查五张牌是否来自同一套。你完了

首先设置一些数据结构来表示西装、等级、卡片和手牌。为了获得良好的性能,有很多方法可以做到这一点,例如使用位向量,但假设我们想要使其可读:为套装和等级创建枚举,为卡片创建结构,为手创建类。顺便说一句,这类示例正是您希望看到的

注意:代码仅用于说明目的:它从未见过编译器。不要期望粘贴此文件并运行

enum Suit { Spades, Hearts, Diamonds, Clubs }
enum Rank { Two, Three, Four, Five, Six, Seven, 
            Eight, Nine, Ten, Jack, Queen, King, Ace }

enum HandType { Nothing, Pair, TwoPair, ThreeOfAKind, Straight,
     Flush, FullHouse, FourOfAKind, StraightFlush }    

public struct Card 
{
   public Suit Suit { get; private set; }
   public Rank Rank { get; private set; }
   public Card(Rank rank, Suit suit)
   {
      Suit = suit;
      Rank = rank;
   }     
}

public class Hand 
{
   public IReadOnlyList<Card> Cards { get; private set };
   public Hand(IEnumerable<Card> cards) 
   { 
      this.Cards = cards.OrderByDescending(c => c.Rank).ToList(); 
   }   
}

至于不同手的概率:那些你应该能够在纸上做的比用程序容易,但是一旦你有了一个分类程序,你可以通过生成所有可能的手,对它们进行分类,很容易得到统计数据,并根据评估的手型对结果进行分组/计数。

首先设置一些数据结构来表示西装、等级、卡片和手。为了获得良好的性能,有很多方法可以做到这一点,例如使用位向量,但假设我们想要使其可读:为套装和等级创建枚举,为卡片创建结构,为手创建类。顺便说一句,这类示例正是您希望看到的

注意:代码仅用于说明目的:它从未见过编译器。不要期望粘贴此文件并运行

enum Suit { Spades, Hearts, Diamonds, Clubs }
enum Rank { Two, Three, Four, Five, Six, Seven, 
            Eight, Nine, Ten, Jack, Queen, King, Ace }

enum HandType { Nothing, Pair, TwoPair, ThreeOfAKind, Straight,
     Flush, FullHouse, FourOfAKind, StraightFlush }    

public struct Card 
{
   public Suit Suit { get; private set; }
   public Rank Rank { get; private set; }
   public Card(Rank rank, Suit suit)
   {
      Suit = suit;
      Rank = rank;
   }     
}

public class Hand 
{
   public IReadOnlyList<Card> Cards { get; private set };
   public Hand(IEnumerable<Card> cards) 
   { 
      this.Cards = cards.OrderByDescending(c => c.Rank).ToList(); 
   }   
}

至于不同手的概率:那些你应该能够在纸上做的比用程序容易,但是一旦你有了一个分类程序,你可以通过生成所有可能的手,对它们进行分类,很容易得到统计数据,并按评估的手型对结果进行分组/计数。

您需要知道有哪些扑克手,以及数据结构如何表示牌?然后上一堂500或600级的大学概率数学课(或者在维基百科上查一查)。看起来你得到的是两对四对三。手是什么的数组?弦乐?还有别的吗?您可以自由选择数据结构吗?这是您正在询问的问题(应该是什么),还是已经给出了数据结构?是否使用了特定的编程语言?@Andersforgren是的,我可以选择数据结构,我更喜欢使用c#/javascript。你需要知道有哪些扑克手以及你的数据是如何使用的