-2

我正在尝试检查一个简单赌博游戏的中奖号码。用户为每个符号(钻石、心形等)选择 4 张牌,然后为该特定选择创建 256 种组合。4*4*4*4 = 256 种组合。我有一个包含 1000 个抽奖结果的数组。每个结果包含 4 张获胜牌及其数值。

我需要检查每个结果包含多少张获胜牌。

我的代码看起来像这样:

    for(int=0;i<results;i++) // [results count] = 1000
    {
         ...
         ...
        //take one results and check it against all combinations 
       for(int j=0;j<userCombinations;j++) // [userCombinations count] = 256
       {
        [self checkWins:[userCombinations objectAtIndex:j]]
       }
    }

-(void)checkWins:(NSMutableArray *)myArray
{
         for(int j=0;j<4;j++)
       {
        //j=0 -> if heart numeric value equals to heart numeric result do something
        //j=1 -> if diamond numeric value equals to diamond numeric results do something

       }
}

代码中可能有一些错别字(凭记忆写的),但基本思想是一样的。我的问题是,上述过程需要:

  • 在我的 i7 Mac Book Pro 上几秒钟

  • 在旧的 Android 上,上面用 java 编写的,需要 6-9 秒。

  • 在 iPhone 4 上,完成该过程需要整整一分钟。< -这是我的问题

难道我做错了什么?你能想出更好的方法来完成上述工作吗?有没有办法加快速度?

谢谢

编辑:

用户选择这些数字

H  D  C   S
7  8  9  10
10 4  2  11
11 6  5  13
12 5  1  9

并得到 256 种组合。

First 6 combinations:      Current Raffle Result: 7 4 9 11
    H  D  C   S
    7  8  9  10    2 matches
    7  8  9  11    3 matches
    7  8  9  13    2 matches
    7  8  9  9     2 matches
    7  8  2  10    1 match
    7  8  2  11    1 Match
    etc'...        

              Total for Current Raffle Result 7 4 9 11:
                   3 matches - one time
                   2 matches - 3 Times
                   1 match - 2 times

我需要传递所有创建的 256 个组合,并根据每个获胜结果检查它们。如果其中一个组合包含中奖号码,我将其标记并将其保存在一个数组中,以便稍后显示。

4

2 回答 2

3

我这样做的方法是将每个抽奖结果表示为一个有序的 c 字符串,例如c5d3h4s6where c5= 5 of clubs come before s6= 6 of 黑桃。类似地将用户选择排序为 c 字符串,例如c2c3c4c6d1d2d3d4h4h5h6h7s7s8s9s10.

这样做的目的是让您不再需要置换用户选择的内部循环。对于每个抽奖,您可以通过选择进行一次扫描以确定是否c5d3h4s6匹配。结果应该快一个数量级。

请注意,我们在这里没有使用 Objective-C 方法调度,因为它在性能方面没有帮助。

于 2013-09-03T21:07:50.307 回答
0

考虑使用数学来解决这个问题(组合或只是计数......)

考虑 1 个用户猜测 - 16 张卡片 - 和 1 个结果 - 4 张卡片。通过最多 16 次比较,您可以确定匹配的套装数量。

如果只有 1 个花色匹配,那么该花色匹配的有 4^3 种组合。

如果有 2 种花色匹配,则有 4^2 种组合匹配这两种花色。但是您还想计算单个匹配项。从上面看,其中一个单场比赛有 4^3 场比赛,但其中一些比赛与双场比赛重叠,因此您需要从 4^3 场比赛中减去 4^2 场比赛,以获得只有 1 场比赛的人数。现在,当您从 2 场比赛开始时,您需要考虑两场单场比赛......

继续 3 和 4 套西装匹配 - 这只是数学,在这个级别不需要循环......

但你可以做得更好;结果基于匹配数(0-4),这意味着您可以预先计算结果,如果在数学中迷失方向,只需列举可能性并计数。这使您降至 1000(解决方案数量)x(最多 16 次比较 + 查找)。

HTH。

于 2013-09-04T00:52:32.993 回答