7

是否可以从等效值中提取该信息?

我知道等价值越高越好。类别和等级也可以从等价值中提取。但是有没有办法从你传递给它的 7 张牌中找出最好的 5 张牌组合?

Twoplustwo 是最快的扑克手牌评估器(每秒评估 14-15 百万手牌)。你给它 7 张牌,它会吐出一个手等值值。值越高,卡越好。

以下是关于 twoplustwo 的精彩总结:http: //www.codingthewheel.com/archives/poker-hand-evaluator-roundup#2p2

上述链接的缓存版本:http://web.archive.org/web/20130116102452/http: //www.codingthewheel.com/archives/poker-hand-evaluator-roundup

4

4 回答 4

8

(免责声明:我正在开发一款扑克软件,其中包括手牌评估)

你给它 7 张牌,它会吐出一个手等值值。

有几个评估员这样做,如果我没记错的话,他们中的一些人每秒计算超过一亿手(!)。这些评估器基本上可以在一个巨大的数组中进行 7 次数组查找,并且只需要几个周期(尽管缓存未命中)来评估一手牌。我不认为 14-15 百万/秒是最快的。如果我没记错的话,CactusKev 的评估器要快 10 倍。

现在回答你的问题:

你如何从你传递给它的 7 张牌中得到最好的 5 张牌组合?

好吧,它不会告诉你,一旦你掌握了手的力量,它就会变得非常容易:你不需要重新发明轮子。

您可以使用强度来简化“七分之五”的计算。

可以使用其他库,直接给您最好的五张卡片(而不仅仅是他们的强度),或者您可以使用强度自己找到五张最佳卡片。

我只举几个例子...

  • 你知道你有一个完整的房子(又名“船”),然后你知道你正在寻找三张具有相同等级的牌,然后是最好的一对(如果有两对,但你肯定会找到至少一个,因为评估员告诉你你有一艘船)。

  • 你知道你有顺子:从最好的一张开始,找出五张彼此跟随的牌(小心特殊的轮盘盒)。

    你也可以对顺子更感兴趣:你可以取每一个可能的顺子的力量,并将评估者给你的力量与这些力量进行比较。如果它匹配,比如说,一个 10 高的顺子,那么只需寻找任何 T、9、8、7 和 6 牌(无论花色如何)。

  • 你知道你没有“对子”:只需拿你找到的最高的五张牌

  • 等等

只有几个不同的等级......它们可能是,例如:

NO_PAIR
ONE_PAIR
TWO_PAIRS
SET
STRAIGHT
FLUSH
FULL_HOUSE
FOUR_OF_A_KIND
STRAIGHT_FLUSH

(如果需要,您当然可以创建中间“直轮”和“直轮”和“皇家同花顺”案例等)

一旦您知道您的手是哪种类型的手(感谢您正在使用的快速评估器),只需切换到一段代码,该代码会在该特定手的七分之五中找到最好的。

我认为这是一个很好的方法,因为您利用了超快速评估器,然后它大大简化了您的逻辑。

在启动时,您需要计算一次强度,例如通过计算:

HIGHEST_NO_PAIR_HAND = ultraFastEvaluator( "As Kd Qh Jc 9d 5s 2c" );

HIGHEST_FULL_HOUSE = ultraFastEvaluator( "As Ac Ad Kh Ks 8s 2h" );

我当然不提倡在这里使用字符串。这只是一个例子...

然后,您可以为每一手牌找到实际的五个最佳手牌:

  • 使用快速评估器计算强度
  • 是 <= HIGHEST_NO_PAIR_HAND 吗?
    • 是:拿五张最高的牌
    • 不:是 <= HIGHEST_ONE_PAIR_HAND 吗?是:拿最高的对子 + 最高的三张牌 否:是 <= HIGHEST_TWO_PAIRS_HAND 吗?
      • 等等

因此,在我看来,您可以重用一个直接从七个中找出五个最好的 API,或者完全重写您自己的 API,但是如果您使用快速评估器的结果来简化您的逻辑,它会更快。

编辑请注意,不一定有一种方法可以做到“七分之五”。例如,在 Kc Kd Qh Qs 2c 公共牌上使用 As Ac,“As Ac Kc Kd Qh”和“As Ac Kc Kd Qs”都是“五强”(最后一个皇后的花色无关紧要)。

于 2012-04-04T16:36:04.977 回答
4

不,不可能提取该信息。查找表仅包含等价值,这些值分为手型和等级;不保留其他信息。

如果您需要每秒评估数百万手牌并获得每手牌的获胜手牌,而不仅仅是排名,您将需要使用不同的评估器。如果您只需要很少提取获胜手,您可以使用此评估器,并在必要时采用较慢的方法来找到最好的 5 张牌。

于 2012-03-30T09:08:17.143 回答
2

旧帖子,但我会试一试。如果您正在使用表格查找(例如,上面提到的 7 卡数组,也称为 Ray Wotton 方法),请在相同的插槽位置构建带有目标信息的第二个表格。示例:我最终在插槽 167,452 中找到我的 eval,现在我将查看插槽 167,452 中的另一个数组以找到我的 5 张牌。

一张牌可以用 6 位表示——花色 2 位,等级 4 位。30 位将给你整个 5 张牌。也许不是那么简单,但这是一般的想法。我在不久前做过的一些事情上使用了这种精确的技术。

或者,您可以传递所有 7-choose-5-card 组合(我相信有 21 个)并找出与原始 eval 匹配的组合。

于 2013-05-07T05:09:30.763 回答
2

twoplustwo 手牌评估器可以评估五张牌手。这是 C# 中的代码:

int LookupFiveCardHand(int[] cards) {
    //assert cards size is 5
    int p = HR[53 + cards[i++]];
    p = HR[p + cards[i++]];
    p = HR[p + cards[i++]];
    p = HR[p + cards[i++]];
    p = HR[p + cards[i++]];
    return HR[p];
}

请注意,尽管有 5 张卡片,但仍有 6 个数组查找。

无论如何,由于评估器如此之快,您可以比较所有可能的 5 卡组合。包含 7 张牌的手牌将有 21 个 5 牌组合。C# 中的代码:

List<int> GetBestFiveCards(List<int> sevenCardHand) {
    List<List<int>> fiveCardHandCombos = new List<List<int>>();

    // adds all combinations of five cards to fiveCardHandCombos
    for (int i = 0; i < sevenCardHand.Count; i++) {
        for (int j = i+1; j < sevenCardHand.Count; j++) {
            List<int> fiveCardCombo = new List<int>(sevenCardHand);
            fiveCardHandCombos.RemoveAt(j); // j > i, so remove j first
            fiveCardHandCombos.RemoveAt(i);
            fiveCardHandCombos.Add(fiveCardCombo);
        }
    }

    Dictionary<List<int>, int> comboToValue = new Dictionary<List<int>, int>();
    for (int i = 0; i < fiveCardHandCombos.Count; i++) {
        comboToValue.Add(fiveCardHandCombos[i], LookupFiveCardHand(fiveCardHandCombos[i]));
    }
    int maxValue = comboToValue.Values.Max();
    return comboToValue.Where(x => x.Value == maxValue).Select(x => x.Key).First(); //grab only the first combo in the event there is a tie
}
于 2018-12-18T12:11:56.327 回答