Arc4random float?

#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