gpt4 book ai didi

iphone - Objective-C for循环问题

转载 作者:行者123 更新时间:2023-12-01 18:32:32 25 4
gpt4 key购买 nike

我有两个方法,在testMethod中调用了generateRandomCard方法,其中有一个for循环运行100次。这样,它可以完美工作,但是如果我将for循环限制设置为1000或任何其他大于100的数字,则会崩溃。你知道出什么事了吗?

- (void)testMethod {

Globals *myGlobals = [Globals sharedInstance];
int rankOfFirst = 0;
int rankOfSecond = 0;
int playerOneWin = 0;
int playerTwoWin = 0;
int ties = 0;
float firstPercent = 0;
float secondPercent = 0;
float tiePercent = 0;
FiveEval *evaluator = [FiveEval theEvaluator];

for (int i = 0; i < 100; i++) {
short fPF = [self generateRandomCard];
short fPS = [self generateRandomCard];
short sPF = [self generateRandomCard];
short sPS = [self generateRandomCard];
short fFlop = [self generateRandomCard];
short sFlop = [self generateRandomCard];
short tFlop = [self generateRandomCard];
short tur = [self generateRandomCard];
short riv = [self generateRandomCard];

rankOfFirst = [evaluator getRankOfSeven:fFlop
:sFlop
:tFlop
:tur
:riv
:fPF
:fPS];

rankOfSecond = [evaluator getRankOfSeven:fFlop
:sFlop
:tFlop
:tur
:riv
:sPF
:sPS];

if (rankOfFirst > rankOfSecond) {
playerOneWin++;
} else if (rankOfSecond > rankOfFirst) {
playerTwoWin++;
} else {
ties++;
}

[myGlobals.alreadyPickedCards removeAllObjects];
}

firstPercent = ((float)playerOneWin/(float)10000)*100;
secondPercent = ((float)playerTwoWin/(float)10000)*100;
tiePercent = ((float)ties/(float)10000)*100;

NSLog(@"First Player Equity: %f", firstPercent);
NSLog(@"Second Player Equity: %f", secondPercent);
NSLog(@"Tie Equity: %f", tiePercent);
}


- (short)generateRandomCard {

Globals *myGlobals = [Globals sharedInstance];
short i = arc4random()%51;
for (int j = 0; j < [myGlobals.alreadyPickedCards count]; j++) {
if (i == [[myGlobals.alreadyPickedCards objectAtIndex:j] shortValue]) {
[self generateRandomCard];
}
}
[myGlobals.alreadyPickedCards addObject:[NSNumber numberWithShort:i]];
return i;
}

最佳答案

您可能在-generateRandomCard的递归调用中是overflowing your stack。如果生成的卡片已经被拾取,则将递归调用自己(并忽略结果,这是一个不同的错误)。因此,如果您的随机数流给您带来了不幸的序列,该序列使您已经选择的返还牌一直保留下来,那么您将无限递归直到筹码量溢出。

更改卡选择算法,以便与其使用可能无限循环/递归的rejection sampling,不如使用带有有限运行时间的算法Fisher-Yates shuffle

关于iphone - Objective-C for循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7113019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com