Если вы знаете, что «input1» находится строго между 0 и 1 или, как правило, «min» и «max» (где известно, что min и max находятся между, но не строго, между 0 и 1), как бы вы получили «input1» увеличивать или уменьшать числовой скачок, заданный «input2», с гарантией того, что новое значение находится строго между минимумом и максимумом и никогда не достигнет минимума или максимума?
Функция инкрементного масштабирования
Ответы (3)
Вам нужна функция распределения, желательно обратимая (обратная называется квантильная функция). Другими словами, вам нужна монотонная строго возрастающая непрерывная функция 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.
Я считаю, что следующее должно держать input1 в пределах min/max
input1 = ((input1 - min + input2) % (max - min)) + min;
Вы можете использовать min/max как
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));
}
Это позволит вам настроить ваши значения и убедиться, что они будут между минимальным и максимальным, но не этими значениями.
max
или меньше-1 * min
, каково правило для обработки этого? - person SubmittedDenied   schedule 11.06.2011input1 = 0.7
,max = 0.75
иinput2 = 2.25
, каким должен быть результат? - person SubmittedDenied   schedule 11.06.2011