关于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对象实例中的资源
累加器的第二次迭代超出了迭代的范围,因此它会随着对象的作用而增长和收缩:-