ユーザーが3つのドアの1つを選択するよう求められたときに、ドアを切り替えるように求められているMonty Hallの問題をモデル化しようとしています。私は選択肢のランダムなバリエーションを探していますが、これは50%の変化率と50%の変化率の範囲にあるはずです。Rubyの乱数ジェネレータがイニシャライザから呼び出されたときに歪んでいます
class Scenario
def initialize
# switched?
end
def switched?
@sw ||= [true, false].sample
end
end
results = { switched: [], stayed: [] }
1000.times do
s = Scenario.new
if s.switched?
results[:switched].push(s)
else
results[:stayed].push(s)
end
end
puts results[:switched].count
puts results[:stayed].count
私は結果のハッシュを検査する場合、この例では、配列の数が予想通りおよそ500/500になる傾向があります。
ただし、初期化メソッドでswitched?
のコメントを外すと、結果は約750/250に分割される傾向があります。結果はまだランダムに見えます(例:738〜262)が、この問題の不正な解決策になるように常に歪んでいます。
私はまた、rand(2).zero?
のような他のメカニズムを使用してデータを生成しようとしましたが、同じ問題が発生します。
なぜこの方法で初期化された関数を呼び出すと、これまでのランダムなバリエーションが発生するのでしょうか?
どちらの場合でも 'initialize'メソッドを表示できますか?初期化メソッドで '|| ='を使用していますか? –
[mcve]を入力してください。あなたはその振る舞いについて素晴らしい説明をしてきましたが、それをどのように生成したのかに関する不完全なコードサンプルがありました。したがって**あなたの問題を**再現する方法はわかりません。 –
しかし、推測では、あなたは 'switched?' ** 2回**と呼んでいるのではなく、変数が 'true'の場合にのみメモに記録されますか?ランダムに 'false'を選択した場合、' || = 'は再評価されます。したがって、「真」が時間の75%に選ばれる。 –