2010-08-06 7 views
36

Можно ли задать диапазон чисел при использовании arc4random()? Например, только 50-100.Как выбрать диапазон значений при использовании arc4random()

+0

используйте modulo для диапазона и добавьте к нему смещение, например arc4random()% 50 + 50; он предоставит вам случайное число в диапазоне от 50 до 99. – holex

ответ

67

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

arc4random_uniform(4) 

сгенерирует 0, 1, 2 или 3. Таким образом, вы можете использовать:

arc4random_uniform(51) 

и просто добавить 50 к результату, чтобы получить диапазон между 50 & 100 (включительно).

+0

Это только дает вам от 0 до 50, не дает вам диапазон от 50 до 100. – Boon

+2

Как Run Loop сказал добавить 50. int num = (arc4random() % (51)) +50; – Nungster

+7

Остерегайтесь [modulo bias] этого метода (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Безопаснее использовать ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

18
int fromNumber = 10; 
int toNumber = 30; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

будет генерировать randon number между 10 и 30, т.е. 11,12,13,14......29

+7

Это (arc4random()% (toNumber-fromNumber + 1)) + fromNumber – malinois

+4

Остерегайтесь [modulo bias] этого метода (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Безопаснее использовать ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

0

Во многих ситуациях 10 через 30 будет означать включительно (в том числе 10 и 30) ...

int fromNumber = 10; 
int toNumber = 30; 
toNumber ++; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

Обратите внимание на разницу toNumber - fromNumber теперь 21 ... (20 + 1), что дает возможные результаты от 0 до 20 (включительно), которые при добавлении из числа (10) приводят к 10-му до 30 (включительно).

+2

Остерегайтесь [modulo bias] этого метода (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias). Безопаснее использовать ['arc4random_uniform()'] (http://stackoverflow.com/questions/648739/objective-c-modulo-bias). – JohnK

27

Чтобы развернуть комментарий JohnK.

Предлагается использовать следующую функцию, чтобы вернуть дистанционное случайное число:

arc4random_uniform(51) 

которая возвращает случайное число в диапазоне от 0 до 50.

Затем вы можете добавить свои нижние границы этого типа:

arc4random_uniform(51) + 50 

, которая возвращает случайное число в диапазоне от 50 до 100.

Причина, по которой мы используем arc4random_uniform(51) свыше arc4random() % 51, состоит в том, чтобы избежать modulo bias. Это выделяется на странице руководства следующим образом:

arc4random_uniform (upper_bound) возвращает равномерно распределенное случайное число, меньшее, чем upper_bound. arc4random_uniform() рекомендуется использовать для таких конструкций, как `` arc4random()% upper_bound '', поскольку он избегает «модульного смещения», когда верхняя граница не равна двум.

Короче говоря, вы получаете более равномерно распределенное случайное число.

+0

Вы совершенно правы. Мы должны использовать arc4random_uniform() !!! – alones

+0

работает также быстро. – kurtanamo

3

Вы можете использовать этот код для генерации случайных значений с диапазоном:

//range from 50 to 100 
int num1 = (arc4random() % 50) + 50; or 
int num1 = arc4random_uniform(50) + 50; 

//range from 0-100 
int num1 = arc4random() % 100; or 
int num1 = arc4random_uniform(100); 
1

В Swift вы можете использовать это (вдохновленный ответ @Justyn)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{ 

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom) 
    return Int(theKey) 
} 

всегда будет давать вам случайный выбор Integer.

+0

Я думаю, что это нужно настроить, так как ваш диапазон всегда будет 1 меньше, чем вы хотите. Вы должны увеличить ваш диапазонTo на 1. 'let theKey = arc4random_uniform (UInt32 ((rangeTo + 1) - rangeFrom)) + UInt32 (rangeFrom)' – Justyn

+0

Кроме того, если вы хотите создать случайный ключ, вы должны, вероятно, вместо этого смотрите: https://stackoverflow.com/a/24428458/1130260 – Justyn

 Смежные вопросы

  • Нет связанных вопросов^_^