Вам нужна функция распределения , предпочтительно обратимая (обратная функция называется квантильная функция ).Другими словами, вам нужна монотонная строго возрастающая непрерывная функция f с lim[x->-oo] f(x) = 0
и lim[x->oo] f(x) = 1
.
Если у вас есть такая функция распределения f и ее обратная функция f⁻¹, то ваша корректирующая функция получает что-токак это:
g (x, Δ) = f( f⁻¹(x) + Δ )
Это для значений от 0 до 1, для других интервалов [a, b]
нам нужно масштабировать его, используя функцию масштабирования s
:
s(x) = (b-a)·x + a, s⁻¹(y) = (y-a)/(b-a)
Тогда функция настройки получает
h(x, Δ) = s(g(s⁻¹(x), Δ) = s( f( f⁻¹(s⁻¹(x)) + Δ )).
Одна легко вычисляемая Java такая функция распределения будет
f(x) = 1 - 0.5 * exp(-x) for 0 ≤ x
f(x) = 0.5 * exp( x) for x ≤ 0
с функцией квантиля
f⁻¹(y) = - log(2 - 2y) for y ≤ 0.5
f⁻¹(y) = log(2 y) for 0.5 ≤ y
Построение из этого вашегоФункция корректировки просто собирает их вместе.
Конечно, это работает только в пределах вашей точности чисел - вы не можете получить произвольно близко к 1.