Инкрементная функция масштабирования - PullRequest
0 голосов
/ 11 июня 2011

Если вы знаете, что 'input1' строго между 0 и 1 или вообще, 'min' и 'max' (где известно, что min и max находятся между, но не строго, 0 и 1), как бы вы получили«input1» для увеличения или уменьшения с помощью числового скачка, заданного «input2» с гарантией того, что новое значение находится строго между min и max и никогда не достигнет min или max?

Ответы [ 3 ]

0 голосов
/ 11 июня 2011

Вы можете использовать мин / макс, как

 public static int adjust(int n, int adjust, int min, int max) {
      return adjust0(n, adjust, min+1, max-1);
 }

 private static int adjust0(int n, int adjust, int trueMininum, int trueMaximum) {
      return Math.max(trueMininum, Math.min(trueMaximum, n + adjust));
 }

Это позволит вам настроить ваши значения и быть уверенным, что оно будет между минимальным и максимальным, но никогда не будет этими значениями.

0 голосов
/ 11 июня 2011

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

0 голосов
/ 11 июня 2011

Я полагаю, что следующее должно держать input1 в пределах min/max

input1 = ((input1 - min + input2) % (max - min)) + min; 
...