#ios #objective-c #random
#iOS #objective-c #Случайный
Вопрос:
Делая это:
float x = arc4random() % 100;
возвращает приличный результат в виде числа от 0 до 100.
Но делать это:
float x = (arc4random() % 100)/100;
Возвращает 0. Как я могу заставить его возвращать значение с плавающей точкой?
Комментарии:
1. Использовать
arc4random_uniform(int)
вместо построения по модулю. Смотрите справочную страницу (arc4random(3)
) почему.2. arc4random_uniform был добавлен в 4.3. Я бы также использовал это вместо моего ответа ниже, если вы сможете.
3. Первая строка возвращает значение int от 0 до 99.
4. Этот выдает только две цифры после запятой; для большего количества цифр используйте
drand48(3)
.
Ответ №1:
Просто вы выполняете целочисленное деление вместо деления с плавающей запятой, поэтому вы просто получаете усеченный результат (например,.123 усекается до 0). Попробуйте
float x = (arc4random() % 100)/100.0f;
Ответ №2:
Вы делите значение int на значение int, что дает значение int. Вам нужно привести либо к значению с плавающей точкой:
float x = (arc4random() % 100)/(float)100;
Также смотрите Мой комментарий об операторе по модулю.
Ответ №3:
Чтобы получить деление с плавающей точкой вместо целочисленного деления:
float x = arc4random() % 100 / 100.f;
Но будьте осторожны, использование % 100
даст вам значение только от 0 до 99, поэтому деление его на 100.f приведет только к случайному значению от 0.00f до 0.99f.
Лучше, чтобы получить случайное значение с плавающей точкой между 0 и 1:
float x = arc4random() % 101 / 100.f;
Еще лучше, чтобы избежать смещения по модулю:
float x = arc4random_uniform(101) / 100.f;
В качестве альтернативы, чтобы избежать смещения точности на две цифры:
float x = (float)arc4random() / UINT32_MAX;
И в Swift 4.2 вы получаете встроенную поддержку диапазонов:
let x = Float.random(in: 0.0...1.0)
Ответ №4:
В Swift:
Float(arc4random() % 100) / 100