Я пытаюсь создать случайный float между 0.15 и 0.3 в Objective-C. Следующий код всегда возвращает 1:
int randn = (random() % 15)+15;
float pscale = (float)randn / 100;
Что я делаю неправильно?
Я пытаюсь создать случайный float между 0.15 и 0.3 в Objective-C. Следующий код всегда возвращает 1:
int randn = (random() % 15)+15;
float pscale = (float)randn / 100;
Что я делаю неправильно?
Попробуйте следующее:
(float)rand() / RAND_MAX
Или получить один от 0 до 5:
float randomNum = ((float)rand() / RAND_MAX) * 5;
Несколько способов сделать то же самое.
Вот функция
- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
}
попробовать
float pscale = ((float)randn) / 100.0f;
Ваш код работает для меня, он производит случайное число между 0,15 и 0,3 (при условии, что я семя srandom()
). Вы вызывали srandom()
до первого вызова random()
? Вам нужно указать srandom()
с некоторым энтропийным значением (многие просто используют srandom(time(NULL))
).
Для более серьезного генерации случайных чисел просмотрите arc4random
, который используется для криптографических целей. Эта функция случайных чисел также возвращает целочисленный тип, поэтому вам все равно нужно передать результат в тип с плавающей точкой.
Самым простым.
+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
return min + arc4random_uniform(max - min + 1);
}
Использование 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);
Чтобы добавить к ответу @Caladain, если вы хотите, чтобы решение было так же просто использовать как rand()
, вы можете определить их:
#define randf() ((CGFloat)rand() / RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)
Невозможно заменить CGFloat
на double
, если у вас нет доступа к CoreGraphics.
Я закончил создание целых чисел один для фактического целого числа, а затем целое число для десятичного числа. Затем я присоединяюсь к ним в строке, затем я разбираю его с floatvalue с помощью функции "floatValue"... Я не мог найти лучшего способа, и это работает для моих намерений, надеюсь, что это поможет:)
int integervalue = arc4random() % 2;
int decimalvalue = arc4random() % 9;
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue];
float randomFloat = [floatString floatValue];