我有以下代码......
@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数字生成器?
一如既往地干杯 马丁
答案 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对象实例中的资源。
第二次迭代你的累加器超出了迭代的范围,因此它会随着对象的作用而增大和缩小。 : - )