2010-02-07 48 views
1

這裏是我的代碼:可可觸摸:RAND()返回相同的字符串

-(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‘BB’DL‘d’F‘L’B 「U」 DDD「L」 URBFD「B」「

我希望它做的是每次給我一個新的移動設置我運行它

我跑這至少30倍,以確保它不是一個僥倖,它真的是返回相同的字符串,果然,它是。

回答

5

你需要確保你的種子你的隨機數發生器第一。

進入你的循環之前做:

srand(time(NULL)); 
+0

謝謝,它的工作(也發現了一個小錯誤,我在int r = rand()%13;我忘了計數0) – 2010-02-07 03:16:58

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的缺乏類變量)

+0

謝謝一堆!我只需要添加srand(time(NULL));它和它的工作!這比我打算做的要好得多(相信我,我上面發佈的代碼將永遠不會進入發貨應用程序) – 2010-02-07 13:17:22