有关Ruby中变量更改的问题

时间:2012-04-27 02:01:48

标签: ruby

我有以下代码......

@organisims.each do |organisim|

  randomvalue = rand(10)
  prediction = organisim.predict

  if prediction == randomvalue
    organisim.resources += 1
  end
  if prediction != randomvalue
    organisim.resources -= 1
  end 
end

如果它所做的预测与随机生成的数字匹配,我试图改变'organisims'资源。它似乎工作正常,如果没有匹配则为-1,如果匹配则为+1。

问题在于,当我迭代这个数组(有机组),处理他们的资源时,我在输出中收到重复项,例如

循环100 平均资源:1500

周期101 平均资源:1500

然后,

周期102 平均资源:1400

周期103 平均资源:1400

这是我的代码问题(我发现它没有问题)还是Ruby使用的psudorandom数字生成器?

一如既往地干杯 马丁

1 个答案:

答案 0 :(得分:0)

我认为这可能是你的累加器范围的一个问题,考虑这个例子。

# example Organism class
class Organisim

  attr_accessor :predict, :resources, :prediction

  def initialize
    @resources = 0
  end

  def predict
    @prediction = rand(10)
    @prediction
  end

end

# initialize @organisims
@organisims = []

100.times do
  @organisims << Organisim.new
end

puts "!!!! Starting Organisim Specific Run"
# iterate over array tracking organisim's resource
@organisims.each_with_index do |org, i|
  # parrallel assignment
  r, p = rand(10), org.predict
  #ruby ternery operator
  (p == r) ? org.resources += 1 : org.resources -= 1
  puts "Run #{i} Prediction: #{org.prediction} Instance Resources: #{org.resources} Overall Resources: n/a"
end

puts "!!!! Cumulative Resource Run"
# resources scoped outside the iteration loop as accumulator
overall_resources = 0

# re-initialize @organisims
@organisims = []

100.times do
  @organisims << Organisim.new
end

@organisims.each_with_index do |org, i|
  # parrallel assignment
  r, p = rand(10), org.predict
  #ruby ternery operator
  #track class level resource
  (p == r) ? org.resources += 1 : org.resources -= 1

  #iterate accumulator
  (p == r) ? overall_resources += 1 : overall_resources -= 1
  puts "Run #{i} Prediction: #{org.prediction} Instance Resources: #{org.resources} Overall Resources: #{overall_resources}"
end

第一个迭代循环就像(我认为)你问题中的那个,但你正在改变organisim对象实例中的资源。

第二次迭代你的累加器超出了迭代的范围,因此它会随着对象的作用而增大和缩小。 : - )