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

最初の反復ループは、質問にあるものと似ていますが(私は思う)、組織オブジェクトインスタンス内のリソースを変更しています。

2 番目の反復では、アキュムレータは反復の範囲外にあるため、オブジェクトが作用するにつれて、アキュムレータは拡大および縮小します。:-)

于 2012-04-27T03:56:30.800 に答える