Создание кривой с заданными минимумом, максимумом и длиной

Мне дается желаемый минимум, максимум и длина массива. Как я могу генерировать числа, которые подходят для «нормально распределенной»/кривой колокола для этого массива с указанными минимумом и максимумом?

i.e.

мин.: 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 ] 

person Riptyde4    schedule 22.06.2017    source источник
comment
Для колоколообразной кривой нет минимума и максимума. Есть среднее и стандартное отклонение. Технически хвосты уходят в положительную и отрицательную бесконечность. Ваш вывод больше похож на треугольную форму волны.   -  person Cory Kramer    schedule 23.06.2017
comment
@CoryKramer правильно понял. Я хочу, чтобы сам массив ИМИТИРОВАЛ форму кривой колокола, если она была построена. Смотрите мой пример   -  person Riptyde4    schedule 23.06.2017
comment
есть проблема в аппроксимации, потому что [0,0,1,6,1,0,0] также является кривой нормального распределения, которая соответствует критериям   -  person kmdreko    schedule 23.06.2017


Ответы (1)


Если ваша проблема действительно состоит в том, чтобы сгенерировать массив со значениями из формы треугольника, то вам нечего делать, кроме предложенного вами простого цикла. Вы даже можете написать функцию, которая возвращает 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));

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

Для случая колоколообразных кривых возможны различные варианты:

  1. Если вас устраивает подход без мозгов, вы можете попробовать Box- Преобразование Мюллера и усечение результата.
  2. Если вы пытаетесь получить что-то, связанное с биномиальным распределением, то тоже есть методы. См. здесь.
person EThome    schedule 22.06.2017