0

確率を使用して、つまり、値が一方の境界またはもう一方の境界(床または天井)にどれだけ近いかに基づいて数値を丸める簡単なRubyの方法は何でしょうか?

たとえば、現在の価格値が28.33の場合、0.014を追加する必要があります。

28.34から始まり、0.004を追加する必要があるのと同じですが、最終的な値は小数点以下2桁に丸める必要があります(パラメーターとして指定するか、今のところ固定することができます)。

したがって、最終的な値は次のようになります。

  • 28.34 60%の確率で、それははるかに近いので、または
  • ランダムチャンス40%の28.35

これが最も役立つ可能性がある理由は、アプリケーションがステートレスであり、実行間で独立しているが、通常は忘却に丸められる有効数字の少ない数字を累積することの正味の効果を概算する必要があるためです(たとえば、影響を与えるマイクロペニー値時間)。たとえば、ストップロスを毎日一定の増分で減らします(代わりに上記の-0.014のような減算)。

このメソッドをFloatクラスに直接拡張すると便利です。

4

2 に答える 2

2

どうですか:

rand(lower..upper) < current ? lower.round(2) : upper.round(2)

編集:

上記は、Ruby 1.9.3を使用している場合にのみ機能します(以前のバージョンでは範囲内のrandがサポートされていないため)。

そうしないと

random_number = rand * (upper-lower) + lower
random_number < current ? lower.round(2) : upper.round(2)
于 2012-04-27T11:08:00.000 に答える
0

この方法を使用して終了します。

class Float
  def roundProb(delta, prec=2)
   ivalue=self
   chance = rand  # range 0..1, nominally averaged at 0.5
#   puts lower=((ivalue + delta)*10**prec -0.5).round/10.0**prec  # aka floor
#   puts upper=((ivalue + delta)*10**prec +0.5).round/10.0**prec  # ceiling
   ovalue=((ivalue + delta)*10**prec +chance-0.5).round/10.0**prec  # proportional probability
   return ovalue
  rescue  
    puts $@, $!
  end
end

 28.33.roundProb(0.0533)
=> 28.39

おそらく最も洗練されたアプローチではありませんが、デフォルトの2の精度の一般的なケースで機能するようです。Ruby1.8.7でも機能しますround()

于 2012-04-27T11:41:12.790 に答える