2011-06-11 93 views
0

如果您知道'input1'嚴格介於0和1之間,或者通常'min'和'max'(其中min和max已知在介於0之間但不是嚴格介於0和1之間)你會得到'input1'來通過'input2'給出的數值跳躍來增加或減少,保證新值嚴格在最小值和最大值之間,並且永遠不會達到最小值或最大值?增量縮放功能

+0

什麼是對輸入2的限制?如果input2可以大於'max'或小於'-1 * min',那麼處理這個的規則是什麼? – SubmittedDenied 2011-06-11 15:02:28

+0

input2> 1,你的功能需要處理保持結果之間的最小和最大 – 2011-06-11 15:06:47

+1

我還不清楚。如果'input1 = 0.7','max = 0.75'和'input2 = 2.25',結果應該是什麼? – SubmittedDenied 2011-06-11 15:15:38

回答

0

您需要一個distribution function,最好是可逆的(反過來稱爲quantile function)。 換句話說,你需要一個單調嚴格遞增的連續函數f與lim[x->-oo] f(x) = 0lim[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

優秀,謝謝! – 2011-06-12 10:15:37

0

我認爲以下應在min/max

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

保持輸入1您可以使用最小/最大像

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

這肯定不會*達不到最大或最小*。 – 2011-06-11 17:36:45

+0

如果它從未達到最大值或最小值,那麼它不是最大值或最小值。我會更新這個例子。 ;) – 2011-06-11 17:42:29