我正在尝试查看简单赌博游戏的中奖号码。 用户选择每个符号的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上完成整个过程需要一分钟。 &LT; - 这是我的问题
我做错了吗?你能想到更好的方法吗? 有没有办法加快速度?
由于
修改
用户选择这些数字
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个组合,并针对每个获胜结果进行检查。如果其中一个组合包含中奖号码,我将其标记并将其保存在一个数组中,以便稍后显示。
答案 0 :(得分:3)
我这样做的方法是将每个抽奖结果表示为一个有序的C字符串,例如c5d3h4s6
其中c5
= 5个俱乐部来自s6
= 6个黑桃。同样,将用户选择命名为c-string,例如c2c3c4c6d1d2d3d4h4h5h6h7s7s8s9s10
。
这样做的目的是让您不再需要内置循环来置换用户选择。
对于每个抽奖活动,您可以对选择进行一次扫描,以确定c5d3h4s6
是否匹配。结果应该快一个数量级。
注意我们这里没有使用Objective-C方法调度,因为它在性能方面没有帮助。
答案 1 :(得分:0)
考虑使用数学(组合学或仅计数......)来解决这个问题。
考虑1个用户猜测 - 16个卡 - 和1个结果 - 4个卡。通过最多16次比较,您可以确定匹配的套装数量。
如果只有一件西装匹配,那么就有4 ^ 3种组合,其中一件西装匹配。
如果2个套装匹配,则有4 ^ 2个组合,其中两个匹配。但你也想计算单场比赛。从上面来看,这些单个匹配的一个有4 ^ 3个匹配,但是其中一些与双重匹配重叠,所以你需要减去4 ^ 3中的4 ^ 2来得到just的数量1场比赛。现在,当您开始进行2场比赛时,您需要考虑两个单场比赛......
继续3&amp; 4套装匹配 - 这只是数学,在这个级别不需要循环...
但你可以做得更好;结果是仅基于匹配数(0-4),这意味着您可以预先计算结果,如果在数学中丢失,只需枚举可能性和计数。这会让你降到1000(解决方案的数量)x(最多16次比较+查找)。
HTH。