关于Ruby中变量更改的问题

关于Ruby中变量更改的问题,ruby,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 我试图改变“Organim

我有以下代码

@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
我试图改变“Organims”资源,如果它做出的预测与随机生成的数字匹配。它似乎工作得很好,如果没有匹配,-1,如果有匹配+1

问题是,当我迭代这个组织数组,处理它们的资源时,我在输出中接收到重复的内容,例如

第100周期 平均资源:1500

第101周期 平均资源:1500

然后呢,

周期102 平均资源:1400

第103周期 平均资源:1400

这是我的代码有问题吗?我看它没有问题,还是Ruby使用的psudorandom数字生成器有问题

一如既往地干杯
马丁

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

# 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
第一个迭代循环类似于我认为您的问题中的循环,但您正在更改OrganiIM对象实例中的资源


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

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

# 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
第一个迭代循环类似于我认为您的问题中的循环,但您正在更改OrganiIM对象实例中的资源

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