1

嘿,我的模拟有问题。

我是 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

如果没有最后两个 put,我不会得到错误,但是当我想计算数组 ren1_sim 和rent_sim 的平均值时,我会得到错误:

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

你知道怎么解决吗?

4

3 回答 3

3

您正在尝试调用meanan Array,这不是Array. 也许您打算使用Statsample::Vector,它是 Statsample 的扩展Array,并且确实有mean

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

您还可以调用to_vector实例Array来获取Statsample::Vector.

于 2012-04-15T00:23:02.837 回答
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
于 2012-04-15T10:20:50.933 回答
0

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

如何从 Ruby 数组创建平均值?

于 2012-04-15T00:03:25.817 回答