Как выбрать диапазон значений при использовании arc4random () - PullRequest
39 голосов
/ 06 августа 2010

Могу ли я установить диапазон чисел при использовании arc4random ()?Например только 50-100.

Ответы [ 6 ]

68 голосов
/ 06 августа 2010

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

arc4random_uniform(4)

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

arc4random_uniform(51)

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

27 голосов
/ 19 декабря 2013

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

Рекомендуется использовать следующую функцию для возврата ранжированного случайного числа:

arc4random_uniform(51)

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

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

arc4random_uniform(51) + 50

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

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

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

18 голосов
/ 16 сентября 2010
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

Сгенерирует randon number между 10 и 30, т.е. 11,12,13,14......29

3 голосов
/ 13 апреля 2015

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

//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 голос
/ 20 декабря 2015

В 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 голосов
/ 04 мая 2013

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

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

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

...