1

这是我的代码:

-(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' DD D' L' URBF D' B' "

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

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

4

2 回答 2

5

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

在进入你的循环之前做:

srand(time(NULL));
于 2010-02-07T03:13:54.060 回答
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 缺少类变量)

于 2010-02-07T04:53:17.767 回答