拥有代表整个甲板中5张已选牌的阵列(52张牌)。
因此,随机手看起来像这样['H3','H6','D3','D4','S4'](这里是h 2对4和3)。
我正在寻找一种方法来了解有关随机5张牌的此属性:

  • 它叫什么名字。 即:“四种”,“三种”等等。
  • 考虑到这是完美的随机性,那只手的概率是多少。
  • 我可以选择数据结构
  • 我用C#

#1楼 票数:4

一旦考虑到存在基于价值的层次结构,识别一手就很容易。 因此,尽管同花顺也是同花顺,而满屋子也是两对,但您始终会选择价值更高的分类。

这意味着,如果您按照价值降序对照每手标准检查五张牌,则第一个匹配正确。 (在这里,类似策略模式可能非常有用。)

至于概率,我只看它们 (请注意,一副完整的牌是52张牌而不是54张牌。)

#2楼 票数:1

关于每手的概率,这是一个简单的计数问题,要考虑到有52个选择5 = 2,598,960手不同的手,因此您只需要计算有多少手有资格胜任每种手并将其除以2598960 。

例如,有4次不同的皇家同花顺->几率4 / 2,598,960 = 0.000153907%

有4 * 10 = 40次不同的同花顺-> 40 / 2,598,960的机会= 0.00153907%

有13 * 48 = 624个不同的四边形-> 624 / 2,598,960的机会= 0.024009603%

等等..

如果您不喜欢计算问题,则可以使用程序来枚举这2598960只手,并计算出冲洗次数,四次方等。

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

#3楼 票数:1 已采纳

首先建立一些数据结构来代表西装,等级,牌和手。 有许多方法可以达到良好的性能,例如使用位向量,但是假设我们要使其可读:使枚举适合西装和等级,为卡结构,为手牌。 顺便说一句,这种类型的示例就是您希望使用F#的地方

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

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(); 
   }   
}

可以采用接手并返回手的种类的方法进行评估。 请注意,这只是对手进行分类 ,实际上并不能算出完整的排名,例如,较高的顺位击败较低的顺位,依此类推。 我省略了实际的实现,但这是一个框架:

public static class HandEvaluator
{
    public static HandType GetHandType(Hand hand)
    {           
       bool isFlush = hand.Cards.Distinct(c => c.Suit).Count() == 1;
       bool isStraight = // five consecutive ranks. Mind the wheel straight Ace->5! 
       if (isStraight && isFlush)
         return HandType.StraightFlush;           

       // group cards by rank, then find the group count & sizes
       var groups = hand.Cards.GroupBy(c => c.Rank);

       if (/* max group size = 4 */)
          return HandType.FourOfAKind;
       if (/* two groups and max group size = 3 */)
          return HandType.FullHouse;
       if (isFlush)
         return HandType.Flush;
       if (isStraight)
         return HandType.Straight;   
       if (/* three groups and max group size 3 */)
          return HandType.ThreeOfAKind;

       // ... And so on for two pair, pair. 

       return HandType.Nothing;
    }
}

至于不同手的概率:应该比使用程序更容易在纸上进行操作,但是一旦有了分类程序,就可以通过生成所有可能的手,对其进行分类以及分组/计数来轻松获得统计信息通过评估的手型得出的结果。

  ask by Haddar Macdasi translate from so

未解决问题?本站智能推荐:

1回复

加倍游戏模拟

我想知道这个模拟器是否可以正常工作,因为我不认为这是合乎逻辑的答案,但也无法捕获错误。 我为以下游戏编写了一个模拟器(给出一副纸牌和1分),以找到最佳策略(发牌商继续进行游戏的最高纸牌) 模拟显示了选择每张MAX卡的获胜系数,这显示了这些数字,这让我非常怀疑,我希望它将增长到1.5到7再
3回复

衡量游戏结果的公式/算法

我有一个有趣的概念性问题,我想知道是否有人可以帮助我对其进行量化。 基本上,我在玩一系列游戏...并且对于每个游戏,我都知道我获胜的可能性,我并列的可能性以及我输掉的可能性(每个游戏都有不同的概率)。 从高层次上讲,我想知道的是:我应该专注于哪些游戏? 例如,我不会为有0%获胜机会的游戏
1回复

计算琐事游戏的准确性

假设您有一款游戏,会给玩家带来一系列正确或错误的问题。 播放器回答它们,程序会记住回答历史记录。 历史记录只是一个布尔值数组,显示玩家是否正确,并在数组开头插入新问题。 确定当前播放器性能的最佳方法是什么? 您可以采用平均错误率(例如每10个问题1个错误)。 但这惩罚了玩家很久以
3回复

数据集中的组检测

假设一组数据点,例如此处绘制的数据点(此图不是特定于我的问题,而只是用作一个合适的示例): 可视化地检查散点图,很明显数据点形成两个“组”,其中一些随机点显然不属于任何一个。 我正在寻找一种算法,这将允许我: 从两个或多个维度的数据集开始。 从数据集中检测此类组,而无需事先知
7回复

获胜刽子手的最优算法

在游戏 Hangman 中,贪心字母频率算法是否等价于最佳获胜机会算法? 为了更好地猜测正确答案,是否有值得牺牲剩余生命的情况? 进一步说明问题: 要猜测的选定单词取自已知词典。 您有 N 条生命,因此必须最大限度地猜出单词中的所有字母而不犯 N 个错误(即您可能有无限数量的正确猜测)。 字典
3回复

Google面试难题[关闭]

给定n个骰子,“ a”边中的每一个和一个和b,返回可获得和b的方式数。 如何减少时间复杂度和空间复杂度? 这是在Google采访中问到的,我不确定答案。
2回复

组合或其他方法?[关闭]

我最近读过这个问题 ,首先,我想到了一个组合方法,但似乎没有人 - 在参赛者中 - 提交了这样的解决方案。 使用组合学的解决方案是否可行? 如果没有,解决方案是什么? 问题简单地说是:给定一个M字的字典,其中任何两个字可以连接在一起并且可能彼此重叠一些字母,找到可以从字典中形成多少长度为N
2回复

概率招聘助理[关闭]

关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来