Случайный IBAction, который выбирает каждый случай только один раз - PullRequest
1 голос
/ 26 июля 2011

У меня проблема с созданием IBAction, который вызывает каждый случай один раз в случайном порядке.
Я много занимался поиском и не нашел хорошего решения этой проблемы. Код, который у меня пока есть,

-(IBAction) random {  
    int text = rand() % 5;  
    switch (text) {         
        case 0:  
            textview.text = @"1";  
            break;  
        case 1:  
            textview.text = @"2";  
            break;  
        case 2:  
            textview.text = @"3";  
            break;  
        case 3:  
            textview.text = @"4";  
            break;  
        case 4:  
            textview.text = @"5";  
            break;  
        default:  
            break;  
    }      
}

Работает нормально, но, как я уже сказал, я хочу, чтобы он вызывал каждый случай только один раз.
Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

Так как вы пытаетесь установить произвольный текст, я бы сделал это следующим образом:

Добавьте iVar с именем что-то вроде stringsArray и инициализируйте его в вашем init:

...
stringsArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
...

Ваш IBAction будет выглядеть так:

-(IBAction) random {  
    if([stringsArray count] == 0) return;
    int text = rand() % [stringsArray count];  
    [textView setText:[stringsArray objectAtIndex:text];
    [stringsArray removeObjectAtIndex:text];
}
2 голосов
/ 26 июля 2011

Как насчет помещения опций, таких как NSNumber s, в NSMutableArray, выбора случайного индекса, отображения его и удаления из массива ... с некоторым другим ответом, если счет достигает нуля.

0 голосов
/ 26 июля 2011

Ну, так или иначе, вам нужно сохранить «систему показателей» и пропустить опции, которые уже были выбраны. Оценочная карта может быть битовой картой (например, простым целым числом, в котором вы устанавливаете биты), массивом логических значений, списком ранее выбранных чисел и т. Д.

Самый простой способ его кодирования - поместить тело вашей логики выше в цикл UNTIL и проверить в цикле после выбора случайного числа, чтобы увидеть, выбрано ли оно уже. Если это так, выполните итерацию в цикле, в противном случае установите свой ответ, заполните соответствующую «галочку» в своей системе показателей и оставьте цикл.

Но ВНИМАНИЕ: цикл должен также включать проверку, чтобы убедиться, что все опции уже выбраны, и выход с некоторым соответствующим указанием в этом случае.

0 голосов
/ 26 июля 2011

Используйте srand вместо rand function

Или еще лучше используйте

inttext = arc4random ()% 5;

...