Создание кривой, заданной min, max и длиной

Мне дается желаемое минимальное, максимальное и длина массива. Как я могу сгенерировать числа, которые соответствуют «нормально распределенной» / кривой колокола для этого массива, с указанными 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 ]

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector