Можно ли задать диапазон чисел при использовании arc4random()? Например, только 50-100.Как выбрать диапазон значений при использовании arc4random()
ответ
Как указано в других сообщениях ниже, лучше использовать arc4random_uniform
. (Когда этот ответ был изначально написан, arc4random_uniform
не был доступен). Кроме того, чтобы избежать смещения по модулю arc4random() % x
, он также избегает проблемы с посевом arc4random
при использовании рекурсивно в короткие промежутки времени.
arc4random_uniform(4)
сгенерирует 0, 1, 2 или 3. Таким образом, вы можете использовать:
arc4random_uniform(51)
и просто добавить 50 к результату, чтобы получить диапазон между 50 & 100 (включительно).
Это только дает вам от 0 до 50, не дает вам диапазон от 50 до 100. – Boon
Как Run Loop сказал добавить 50. int num = (arc4random() % (51)) +50; – Nungster
Остерегайтесь [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
int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
будет генерировать randon number
между 10
и 30
, т.е. 11,12,13,14......29
Это (arc4random()% (toNumber-fromNumber + 1)) + fromNumber – malinois
Остерегайтесь [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
Во многих ситуациях 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 (включительно).
Остерегайтесь [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
Чтобы развернуть комментарий 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 '', поскольку он избегает «модульного смещения», когда верхняя граница не равна двум.
Короче говоря, вы получаете более равномерно распределенное случайное число.
Вы можете использовать этот код для генерации случайных значений с диапазоном:
//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);
В Swift вы можете использовать это (вдохновленный ответ @Justyn)
func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{
let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom)
return Int(theKey)
}
всегда будет давать вам случайный выбор Integer.
Я думаю, что это нужно настроить, так как ваш диапазон всегда будет 1 меньше, чем вы хотите. Вы должны увеличить ваш диапазонTo на 1. 'let theKey = arc4random_uniform (UInt32 ((rangeTo + 1) - rangeFrom)) + UInt32 (rangeFrom)' – Justyn
Кроме того, если вы хотите создать случайный ключ, вы должны, вероятно, вместо этого смотрите: https://stackoverflow.com/a/24428458/1130260 – Justyn
используйте modulo для диапазона и добавьте к нему смещение, например arc4random()% 50 + 50; он предоставит вам случайное число в диапазоне от 50 до 99. – holex