it-swarm.com.ru

Как создать случайное число с плавающей точкой в ​​Objective-C?

Я пытаюсь создать случайное плавание между 0,15 и 0,3 в Objective-C. Следующий код всегда возвращает 1:

int randn = (random() % 15)+15;
float pscale = (float)randn / 100;

Что я делаю неправильно?

32
Roman

Попробуй это: 

 (float)Rand() / Rand_MAX

Или получить значение от 0 до 5:

 float randomNum = ((float)Rand() / Rand_MAX) * 5;

Несколько способов сделать то же самое.

20
Caladain

Вот функция

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)Rand_MAX + 1)) / Rand_MAX) * diff) + smallNumber;
}
63
Boris
  1. используйте arc4random () или запишите ваши случайные значения
  2. пытаться

    float pscale = ((float)randn) / 100.0f;
    
4
Lou Franco

Ваш код работает для меня, он выдает случайное число от 0,15 до 0,3 (при условии, что я заполняю srandom()). Вы звонили srandom() до первого вызова random()? Вам нужно будет предоставить srandom() некоторое энтропийное значение (многие люди просто используют srandom(time(NULL))).

Для более серьезной генерации случайных чисел, загляните в arc4random , который используется для криптографических целей. Эта функция случайных чисел также возвращает целочисленный тип, так что вам все равно придется приводить результат к типу с плавающей запятой.

3
dreamlax

Самый простой.

+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
    return min + arc4random_uniform(max - min + 1);
}
2
jose920405

Чтобы добавить к ответу @ Caladain, если вы хотите, чтобы решение было таким же простым в использовании, как Rand(), вы можете определить это:

#define randf() ((CGFloat)Rand() / Rand_MAX)
#define randf_scaled(scale) (((CGFloat)Rand() / Rand_MAX) * scale)

Не стесняйтесь заменить CGFloat на double, если у вас нет доступа к CoreGraphics.

0
Ben Leggiero

Использование srandom () и Rand () небезопасно, когда вам нужно истинное рандомизирование с помощью некоторого числа с плавающей запятой.

На MAC_10_7, IPHONE_4_3 и выше вы можете использовать arc4random_uniform (upper_bound) * . Это позволяет генерировать истинное случайное целое число от нуля до * upper_bound *.

Таким образом, вы можете попробовать следующее

u_int32_t upper_bound = <some big enough integer>;

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2);
0
malex