Я хотел бы сгенерировать числа в массив с нормальным распределением. Есть ли какая-либо функция в target-c или c, которая может помочь легко получить результат без какой-либо математики?
генератор случайных значений с нормальным распределением для target-c
Ответы (2)
Используйте Box-Muller-Transformation:
1.) вам нужны два равномерно распределенных случайных числа u и v как удвоения в интервале (0,1] (0 необходимо исключить):
double u =(double)(random() %100000 + 1)/100000; //for precision
double v =(double)(random() %100000 + 1)/100000; //for precision
2.) рассчитать равномерное распределенное значение со средним значением 0 и сигмой стандартного отклонения, равным 1:
double x = sqrt(-2*log(u))*cos(2*pi*v); //or sin(2*pi*v)
3.) при необходимости добавьте сигму и среднее значение для вашего целевого распределения следующим образом:
double y = x * sigmaValue + averageValue;
4.) поместите его в массив
[randomNumberArray addObject:[NSNumber numberWithDouble:y]]
Нет функции norminv
для objc. Так что здесь нужна математика.
Изменить: мне нравится использовать random()
, чтобы иметь возможность запускать генератор случайных значений.
[randomNumberArray sortedArrayUsingSelector:@selector(compare:)]
?
- person JFS; 04.03.2013
Позвольте мне в предисловии сказать, пожалуйста, поправьте меня, если я ошибаюсь!
Насколько я понимаю, преобразование Бокса-Мюллера основано на том, что исходные числа сами по себе равномерно распределены, поэтому использование random() или rand() в качестве исходного набора данных для Бокса-Мюллера НЕ обязательно производить равномерное распределение.
Вместо этого предполагается взять общий набор равномерно распределенных случайных чисел и создать независимые пары случайных чисел, равномерно распределенных в двумерной системе координат.
Википедия: преобразование Бокса-Мюллера
Однако есть и другой способ:
В большинстве систем Unix (и, следовательно, в Objective C на iOS или OSX) с использованием библиотеки функций rand48:
double drand48(void);
void srand48(long int seedval);
srand48() запускает генератор, а drand48() создает случайные числа, равномерно распределенные в интервале [0,0–1,0].
random()
, но мне нужно создать ту же последовательность с нормально распределенными числами. Вот почему я не могу использовать arc4random() или другие лучшие подходы. Как мне реализовать эти функции Unix в iOS?
- person JFS; 06.09.2013