касание какао: rand () возвращает ту же строку - PullRequest
1 голос
/ 07 февраля 2010

Вот мой код:

-(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 D 'L' U R B F D 'B'"

Что я хочу сделать, так это давать мне новый набор ходов каждый раз, когда я его запускаю

Я выполнил это как минимум 30 раз, чтобы убедиться, что это не случайность, и что она действительно возвращает ту же строку, и, конечно же, так и есть.

Ответы [ 2 ]

5 голосов
/ 07 февраля 2010

Вы должны убедиться, что сначала запустили генератор случайных чисел.

перед входом в ваш цикл выполните:

srand(time(NULL));
1 голос
/ 07 февраля 2010

Обратите внимание, что вы создаете 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 отсутствуют переменные класса)

...