Мне дается желаемое минимальное, максимальное и длина массива. Как я могу сгенерировать числа, которые соответствуют «нормально распределенной» / кривой колокола для этого массива, с указанными min и max?
то есть
мин: 0
макс: 6
длина = 7
результат: [0,2,4,6,4,2,0]
Я знаю, что могу линейно интерполировать между минимальным и максимальным, чтобы добраться до середины, затем в обратном направлении обратно до минимума в конце массива. Однако есть ли способ сделать это с помощью дистрибутива? тогда вытащить значения из этого?
то есть я думал что-то вроде этого
max - min = diff
diff / (length/2) = increment
[min + increment*index, ..., max, max - increment*index, ..., min ]
Если ваша задача на самом деле — создать массив со значениями из треугольной формы, то вам не нужно ничего делать, кроме предложенного вами простого цикла. Вы даже можете написать функцию, которая возвращает f(k)
, Например г так:
double get_kth_value(double min, double max, int length, int k) {
int mid = length/2;
if (k < mid) {
return min + (max - min) * k / mid;
} else {
return min + (max - min) * (length - 1 - k) / mid;
}
}
Когда ты сказал:
Однако есть ли способ сделать это с помощью дистрибутива? затем потяните
значения от этого?
Интересно, намекаете ли вы на то, что ваша проблема немного отличается? Формулировка предполагает, что вы хотите сделать выборку в соответствии с данным распределением. То есть, вы хотите вычислить y = f (x) для x равномерной случайной переменной, и вероятность того, что вы получите заданный y, определяется некоторым заданным распределением (колокол, бином, треугольник, еще много чего). Тогда это становится более веселым (хотя и супер классическим).
Общий кувалда для этого выборка обратного преобразования. Вы вычисляете совокупную функцию распределения, и вот, пожалуйста. Для случая, когда вы предлагаете треугольную форму, это достаточно просто. В основном вы хотите что-то вроде
double t = 2*uniformly_random_double_in_01()-1;
double y = breadth/2*(1-sqrt(1-fabs(1-t)))*(1-2*(t<0));
Прошу прощения за то, что я не корректировал границы правильно, вам тоже понадобится кое-что, особенно если вы хотите целочисленные значения.
Для случая кривых колокола есть различные варианты:
Других решений пока нет …