0

如果您知道“input1”严格介于 0 和 1 之间,或者通常是“min”和“max”(已知 min 和 max 介于但不严格介于 0 和 1 之间),您将如何获得“input1”通过'input2'给出的数字跳跃来增加或减少,并确保新值严格在最小值和最大值之间并且永远不会达到最小值或最大值?

4

3 回答 3

0

您需要一个分布函数,最好是可逆的(逆函数称为分位数函数)。换句话说,您需要一个单调严格递增的连续函数 flim[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。

于 2011-06-11T18:35:07.147 回答
0

我相信以下内容应将 input1 保持在min/max

input1 = ((input1 - min + input2) % (max - min)) + min; 
于 2011-06-11T15:13:22.980 回答
0

您可以使用 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));
 }

这将允许您调整您的值,并确保它在最小值和最大值之间,但绝不是这些值。

于 2011-06-11T15:17:02.170 回答