c# - 确定扑克牌同花顺手

标签 c# .net optimization

在纸牌应用程序中,我使用 0-51 来表示手牌为 5 的手牌。

花色是card/13
等级是card %
只有 4 种可能的花色(黑桃、红心、梅花方 block )

如果所有五套花色都相同,则为同花。所有同花顺都具有同等值(value)。黑桃与方 block 相同。

我知道你会说预优化是邪恶的,但我正在运行一些模拟来做这百万次,这是最昂贵的一步。该卡可能是字节,但使用 int 计算似乎更快。我并没有真正检查范围,但我把它放进去是为了让你知道有一个范围。

有没有更有效的方法?

public bool IsFlush(int[] quick)
{
    HashSet<int> suit = new HashSet<int>();
    suit.Add(quick[0] / 13);
    int thisQuick;
    for (int i = 1; i < quick.Length; i ++)
    {
        thisQuick = quick[i];
        if (thisQuick < 0 || thisQuick > 51)
            throw new IndexOutOfRangeException();
        if (suit.Add(thisQuick / 13))
            return false;
    }
    return true;
}

最佳答案

消除 HashSet 应该会加快速度:

public static bool IsFlush(int[] hand)
{
    int firstSuit = hand[0] / 13;
    for (int i = 1; i < hand.Length; i++)
    {
        int card = hand[i];
        if (card < 0 || card > 51)
            throw new IndexOutOfRangeException();
        if (firstSuit != (card / 13))
            return false;
    }
    return true;
}

我的(公认的微不足道的)测试显示性能提高了大约 20%。

关于c# - 确定扑克牌同花顺手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43242270/

相关文章:

javascript - 使用原型(prototype)的最佳方式 [OOP]

c# - ASP.NET Web API ActionFilter 示例

c# - 关键字 'add' 附近的语法不正确

c# - 确定实例已覆盖 GetHashCode 和 Equals?

.net - 什么可能导致 .NET WinForms 应用程序在没有对话框的情况下突然关闭?

java - 5-Op Log2(Int 32) Bit Hack 可以用 Java 完成吗?

c++ - 替换大量异常使用的最佳方法?

c# - 在 IIS 下运行时无法连接到 Elasticsearch(访问 key 和 secret 不被尊重)

c# - 获取所有只出现一次的元素

c# - 此 DDD 应用程序中有哪些聚合?