cocoa touch:rand()返回相同的字符串

时间:2010-02-07 03:08:41

标签: iphone cocoa-touch random rubiks-cube

这是我的代码:

-(void)randommoves
{

NSArray *possiblemoves =[NSArray arrayWithObjects:@"R ",@"R' ",@"L ",@"L' ",@"B ",@"B' ",@"F ",@"F' ",@"U ",@"U' ",@"D ",@"D' ", nil];
NSMutableString *finalmoves = [[NSMutableString alloc] init];
finalmoves = [NSMutableString stringWithCapacity:0]; 
[finalmoves retain];
int i = 0;
for (i=0; i<20; i++) {
    int r = rand() % 13;
    NSString *string = [possiblemoves objectAtIndex:r];
    [finalmoves appendString:string];
}
NSLog(@"%@",finalmoves);
[finalmoves release];
}

每次我跑的时候都会得到完全相同的字符串“D'B B'D L'D'F'L'B'U'D D'L'U R B F D'B'”

我想要它做的是每次运行时都给我一个新动作

我已经跑了至少30次,以确保它不是侥幸,并且它确实返回相同的字符串,果然,确实如此。

2 个答案:

答案 0 :(得分:5)

您需要确保首先为随机数生成器播种。

在进入你的循环之前

执行:

srand(time(NULL));

答案 1 :(得分:1)

请注意,您要创建finalMoves两次。一次使用[[NSMutableString alloc] init],然后再使用[NSMutableString stringWithCapacity:0]。这意味着你正在泄漏记忆。

如何清理这样的代码:

static NSArray* sPossibleMoves = nil;

+ (void) initialize
{
    sPossibleMoves = [[NSArray arrayWithObjects: @"R ",@"R' ",@"L ",@"L' ",@"B ",@"B' ",@"F ",
        @"F' ",@"U ",@"U' ",@"D ",@"D' ", nil] retain];
}

- (void) randomMoves
{
    NSMutableString* finalmoves = [NSMutableString stringWithCapacity: 20];
    if (finalMoves != nil) {
        for (int i = 0; i < 20; i++) {
            [finalMoves appendString: [sPossibleMoves objectAtIndex:
                (rand() % [sPossibleMoves count])]];
        }
        NSLog(@"%@",finalmoves);
    }
}

假设您经常调用它,那么在全局中保持可能的移动是有意义的(因为Objective-C缺少类变量)