Какой самый оптимальный способ получить случайное число с плавающей точкой между floatA и floatB? - PullRequest
6 голосов
/ 20 мая 2009

У меня есть интервал, состоящий из двух чисел с плавающей точкой, и мне нужно сгенерировать 20 случайных чисел в виде, которые находятся где-то между этим интервалом, определяемым двумя числами с плавающей точкой.

Скажем, например:

float a = 12.49953f
float b = 39.11234f
float r = //best way to get best randomly numbers between a and b

Случайное число может быть == a и == b. Что ты предлагаешь? Я знаю, что у всех компьютеров и языков есть проблемы со случайными числами, и что есть много способов их генерировать. Но у меня нет опыта в цели c.

Очень важно, чтобы сгенерированные числа не были одинаковыми в одном блоке из 20 чисел, сгенерированных в цикле. Я думаю, для этого я бы сделал метод, поместил число в массив и проверил, отличается ли сгенерированное число от всех остальных в массиве, и если нет, я бы сгенерировал другой.

Я пробовал это:

CGFloat r = 1 + arc4random ()% 5;

но это будет генерировать только целые числа, и большую часть времени я получаю 2 раза одно и то же случайное число за другим.

Ответы [ 4 ]

5 голосов
/ 20 мая 2009

попробуйте

float a = 12.49953f;
float b = 39.11234f;
int startVal = a*10000;
int endVal = b*10000; 

srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
int randomValue = startVal+ (random() % (endVal - startVal));

float r = (float)randomValue / 10000.0f; 
3 голосов
/ 20 мая 2009

Обычно вы получаете случайное число от 0 до 1 (1 исключено) по случайной функции. Это можно равномерно распределить до требуемого интервала, умножив случайное число на длину интервала между a и b и добавив к нему меньшее значение.

с

float r = random();
return a+(b-a)*r;

Для задачи с 20 различными случайными числами: с 20 числами - я бы создал какой-то массив и делал бы линейный поиск каждый раз, как вы предложили. Это легко реализовать без сбоев и отладки. Это экономит ваше время на решение более сложных задач. 20 достаточно мало, чтобы линейный поиск не оказывал существенного влияния на производительность.

0 голосов
/ 18 декабря 2013

При использовании arc4random для получения значения с плавающей точкой неплохо разделить его на максимальное значение. Это даст вам плавание в диапазоне от 0 до 1 с довольно высокой точностью. Вместо того, чтобы получить значение от 1 до 100, получится 1 2 3 4 ...

#define ARC4RANDOM_MAX  0x100000000
float r = ((double)arc4random() / ARC4RANDOM_MAX);

Как сказал Тобиас, чтобы получить диапазон, вы должны использовать что-то вроде

float result = a + ((b-a)*r);
0 голосов
/ 25 марта 2012

Это то, что я использую, эквивалентно Python random.uniform ():

   float random_uniform(float min, float max) {
       // equivalent of random.uniform()
       return ((float)arc4random_uniform(((max-min)*1000)))/1000+min;
   }

arc4random_uniform дает довольно хорошее равномерное распределение. Умножение на 1000 позволяет обрабатывать числа меньше 1. Увеличьте множитель (и делитель), чтобы повысить точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...