我正在尝试模拟蒙提霍尔问题,其中用户被要求选择三个门之一,然后提供更改选择的选项。我正在寻找随机选择的变化,应该在50%更改和50%保持不变的范围内。
当我检查结果哈希表时,在这个例子中,数组计数 tend to be about 500/500 as expected。
然而,如果我在 initializer 方法中取消注释 switched?,结果 tend to be split about 750/250。结果仍然看起来是随机的(例如738 到 262),但它们总是倾向于成为该问题的错误解决方案。
我还尝试使用其他机制比如 rand(2).zero? 来生成数据,但是同样的问题发生了。
为什么或者怎么会调用这个记忆化函数在初始化器中导致随机变异如此远离正确结果,而且始终如此?
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
当我检查结果哈希表时,在这个例子中,数组计数 tend to be about 500/500 as expected。
然而,如果我在 initializer 方法中取消注释 switched?,结果 tend to be split about 750/250。结果仍然看起来是随机的(例如738 到 262),但它们总是倾向于成为该问题的错误解决方案。
我还尝试使用其他机制比如 rand(2).zero? 来生成数据,但是同样的问题发生了。
为什么或者怎么会调用这个记忆化函数在初始化器中导致随机变异如此远离正确结果,而且始终如此?
initialize
方法吗?你在 initialize 方法中使用了||=
吗? - Ray Toalswitched?
两次,只有当变量为true
时才会被记忆化吗?如果你随机选择false
,那么||=
就会被重新评估;因此true
会被选中 75% 的时间。 - Tom Lord