Ruby中的蒙特卡罗模拟

时间:2012-04-15 00:00:07

标签: ruby statistics simulation montecarlo

嘿,我的模拟有问题。

我是Ruby-Starter,不知道我的代码有什么问题。这只是模拟的一部分:

def mean
 mean = self.reduce(:+)/self.length.to_f
 return mean
end

def randn
  begin 
  rg1 = (rand*2)-1 
  rg2 = (rand*2)-1 
  q = rg1**2 + rg2**2
  end while (q == 0 || q > 1)
  p = Math.sqrt((-2*Math.log(q))/q)

  rn1 = rg1 * p
  rn2 = rg2 * p
  return rn1, rn2
 end

monte_carlo = 10
ren1_sim = Array.new
ren2_sim = Array.new

monte_carlo.times {
 (1..20).each{ |i|
 (1..250).each { |j|
  r = randn() 
    ren1= * Math.exp(mu_ren1 + sigma_ren1 * r[0]) 
    # ren1 is an array with prices, mu_ren1 and sigma_ren1 are individual values

    ren2= * Math.exp(mu_ren2 + chol_21 * r[0] + chol_22 * r[1])
    # chol_21 and chol_22 are also individual values

     ren1_sim.push(ren1)
     ren2_sim.push(ren2)
   } 
  }
 }
 puts ren1_sim.mean
 puts ren2_sim.mean

如果没有最后两次放置,我没有收到错误,但是当我想计算数组ren1_sim和rent_sim的平均值时,我得到错误:

 undefined method 'mean' for #<Array:0x2acf318> (NoMethodError)

你知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

您尝试在mean上调用Array,这不是Array的方法。也许您打算使用Statsample::Vector,这是Array的Statsample的扩展名,并且确实有mean

ren1_sim = Statsample::Vector.new
ren2_sim = Statsample::Vector.new

您还可以在Array个实例上致电to_vector以获取Statsample::Vector

答案 1 :(得分:2)

您已在文件顶部定义了mean方法,但这只是在顶级对象上创建了一个方法,并且您尝试在单个数组上调用它。您可以将该代码更改为

def mean(array)
  array.reduce(:+)/array.length.to_f
end

然后将您的使用情况更改为mean(ren1_sim)

或更改您的代码,以便将方法添加到数组中,即

class Array
  def mean
    self.reduce(:+)/self.length.to_f
  end
end

答案 2 :(得分:0)

查看这篇文章来计算数组的平均值

How do I create an average from a Ruby array?