Подтвердить что ты не робот

Как создать случайный float в Objective-C?

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

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

 (float)rand() / RAND_MAX

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

 float randomNum = ((float)rand() / RAND_MAX) * 5;

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

Ответ 2

Вот функция

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
}

Ответ 3

  • используйте arc4random() или запустите ваши случайные значения
  • попробовать

    float pscale = ((float)randn) / 100.0f;
    

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Использование 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);

Ответ 7

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

#define randf() ((CGFloat)rand() / RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)

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

Ответ 8

Я закончил создание целых чисел один для фактического целого числа, а затем целое число для десятичного числа. Затем я присоединяюсь к ним в строке, затем я разбираю его с floatvalue с помощью функции "floatValue"... Я не мог найти лучшего способа, и это работает для моих намерений, надеюсь, что это поможет:)

int integervalue = arc4random() % 2;
int decimalvalue = arc4random() % 9;   
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue];
float randomFloat = [floatString floatValue];