使用概率舍入小数

时间:2012-04-27 10:44:56

标签: ruby math probability finance

使用概率对数字进行舍入的简单Ruby方法可能是什么,即基于值与一个边界或另一个边界(地板或天花板)的接近程度?

例如,假设当前价格值为28.33,我需要添加0.014。

相当于从28.34开始并需要添加0.004,但最终值必须四舍五入到两位小数(可以作为参数提供,或者现在修复)。

因此,最终值应为:

  • 28.34,有60%的几率,因为它更接近,或者
  • 28.35,随机机率为40%

它出现的原因可能是最好的,因为应用程序在运行时是无状态且独立的,但仍需要近似累积通常舍入为遗忘的较低有效数字的净效应(例如,确实存在的微量数值)对时间的影响)。例如,每天通过一些变量增量减少止损(相反,减去上面的-0.014)。

将此方法直接扩展到Float类会很有用。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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.甚至适用于Ruby 1.8.7我坚持在一个案例中,缺少{{1}的精度参数}。