0

'input1'が厳密に0と1の間、または一般的に'min'と'max'(minとmaxは0と1の間にあることがわかっていますが、厳密には0と1の間)であることがわかっている場合、'input1'はどのように取得されますか新しい値が厳密に最小値と最大値の間にあり、最小値または最大値に到達しないことを保証して、「input2」で指定された数値ジャンプによってインクリメントまたはデクリメントしますか?

4

3 に答える 3

0

私は以下がinput1を内に保つべきだと信じていますmin/max

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

あなたは次のように最小/最大を使用することができます

 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 に答える
0

分布関数、できれば可逆関数が必要です(逆関数は分位関数と呼ばれます)。言い換えると、とで厳密に増加する単調連続関数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で計算できるこのような分布関数の1つは、

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 に答える