2011-06-11 96 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