2

我有以下代码...

@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 使用的伪随机数生成器?

像往常一样干杯马丁

4

1 回答 1

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 对象实例中的资源。

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

于 2012-04-27T03:56:30.800 回答