Используйте один раз на число arc4random () - PullRequest
1 голос
/ 08 января 2012

Как вы кодируете arc4random (), который не повторяет число дважды?

Например. Я использую переключатель и кнопку. Я не хочу генерировать повторно одно и то же число arc4random снова. Если у меня есть arc4random, то число поколений 2,4,42,32,42 ... Я не хочу, чтобы 42 появился снова.

Как мне избежать этого?

  switch (arc4random() % 50 )
        {
            case 1:
                text.text = @"You are silly boy";
                break;
            case 2:
                text.text = @"Well, you very very silly"];
                break;
            case 3:
                text.text = @"stop being silly"];
                break;
            case 4:
                [text.text = @"silly... silly"];
                break;
            case 5:
                text.text = @"what you silly boy"];
                break;

           ...
            case 0:
                text.text = @"you silly"];
                break;
        }

Ответы [ 2 ]

6 голосов
/ 08 января 2012

arc4random() не является повторяющимся генератором, то есть каждый вызов не зависит от всех других вызовов.Но это также означает, что простой вызов arc4random() (в общем случае) не даст 50 уникальных чисел.

Один из способов - создать массив целых чисел, который вам нужен, а затем пройтись по массиву и поменять местами одно с другимвыбран случайным образом (в вашем случае) с помощью (arc4random ()% 50).Они просто используют последовательные значения из массива, а когда в конце создают новый массив и рандомизируют его.

Пример: значения в списке будут случайными числами от 0 до 49 без повторов:

int n = 50;
int list[n];
for (int i = 0; i<n; i++)
    list[i] = i;

for (int i = n-1; i>=1; i--) {
    int ran = arc4random() % (i+1);
    int tmp = list[i];
    list[i] = list[ran];
    list[ran] = tmp;
}

for (int i = 0; i<n; i++)
    NSLog(@"%d", list[i]);

Это современная версия шаффла Фишера-Йейтса, разработанная для использования на компьютере и представленная Ричардом Дюрстенфельдом.

Примечание: использование мода для создания подмножества создает смещение, но в случае 50смещение незначительно.

0 голосов
/ 08 января 2012

Один из способов сделать это будет следующим:

static int maxNumOfCases = 50; //This could be any number of cases that you need in your app.

......

switch (arc4random() % (maxNumOfCases--)) {
            case 1:
                text.text = @"You are silly boy";
                break;
            case 2:
                text.text = @"Well, you very very silly"];
                break;
            case 3:
                text.text = @"stop being silly"];
                break;
            case 4:
                [text.text = @"silly... silly"];
                break;
            case 5:
                text.text = @"what you silly boy"];
                break;
                ...
            case 0:
            text.text = @"you silly"];
            break;
}

Этот код всегда переключается на уникальный регистр при каждом вызове. Код работает, уменьшая диапазон arc4random() при каждом вызове на 1.

Обновление: Имейте в виду, что этот метод смещает больше к концу цикла к меньшему диапазону чисел. Так что это не настоящая неповторяющаяся генерация случайных чисел. Но если это не проблема, его легко включить в ваш код.

...