Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 关于阵列的Monty Hall模拟问题_Arrays_Logic_Simulation - Fatal编程技术网

Arrays 关于阵列的Monty Hall模拟问题

Arrays 关于阵列的Monty Hall模拟问题,arrays,logic,simulation,Arrays,Logic,Simulation,我遇到了一个关于Montey Hall统计谜语的模拟问题。对于我的答案,我应该得到一致的结果33%/66%,但每运行三次模拟,结果都是0/100,然后它们会翻转到66%/33%。我相信问题可能与我如何创建阵列有关,即一个模拟的结果会渗透到下一个模拟中,但我无法确定问题所在。另外,如果您有任何关于更好地编写我的模拟的建议,我也将不胜感激 下面是我的代码 模拟猜门 def sim_猜测: 答案=[] 猜测=[0,1,2] 战略=[0.2,0.6,0.2] 对于RangeSim中的元素: answer

我遇到了一个关于Montey Hall统计谜语的模拟问题。对于我的答案,我应该得到一致的结果33%/66%,但每运行三次模拟,结果都是0/100,然后它们会翻转到66%/33%。我相信问题可能与我如何创建阵列有关,即一个模拟的结果会渗透到下一个模拟中,但我无法确定问题所在。另外,如果您有任何关于更好地编写我的模拟的建议,我也将不胜感激

下面是我的代码

模拟猜门 def sim_猜测: 答案=[] 猜测=[0,1,2] 战略=[0.2,0.6,0.2] 对于RangeSim中的元素: answer.appendnp.random.choiceguess,p=stratagy 回覆 模拟颁奖 def模拟_prizedoornsim: 门=[0,1,2] 答案=[] 对于RangeSim中的元素: answer.appendnp.random.choicedoors 回覆 模拟打开门以显示山羊 def goat_doorprize,猜猜看: 答案=[] 对于我在兰格兰奖: 门=[0,1,2] 如果奖品[i]==猜测[i]: 门。移除奖品[i] answer.appendnp.random.choicedoor 其他: 门。移除奖品[i] 门。移除[i] 回答。追加门[0] 回覆 模拟山羊被发现后改变猜测 def开关_猜测,猜测: 答案=[] 对于我在rangelengoat: 门=[0,1,2] 门。拆除门[i] 门。移除[i] 回答。追加门[0] 回覆 显示10000次试验后的百分比 def win_percentageprize,猜猜: wins=[] 奖品中的元素: wins.appendprize[元素]==猜测[元素] 答案=floatnp.sumwins/长度*100 回覆 奖品=10000 猜测=模拟猜测10000 不改变猜测就赢 打印获奖百分比奖品,猜猜看 变猜赢 猜猜看,是山羊奖吗 开关=开关 打印win_percentageprize,开关
我觉得这将是一个更容易做的对象,因为每个游戏是独立于其他。我可能会这样做

import random

class Game:
        winningDoor = 0
        chosenDoor = 0
        goat = 0
        def __init__(self):
                self.winningDoor = random.randint(1,3)
        def play(self, move, willSwap):
                self.chosenDoor = move
                self.goat = 0
                i=1
                while(self.goat <= 0):
                        if(i != self.winningDoor and i != self.chosenDoor):
                                self.goat = i
                        i += 1
                if(willSwap):
                        self.chosenDoor = 6-(self.chosenDoor + self.goat)
                return (self.winningDoor == self.chosenDoor)


def main():
        swapwins = 0
        staywins = 0
        for i in range(0,10000):
                testswap = Game()
                if(testswap.play(random.randint(1,3), 1)):
                        swapwins += 1
                teststay = Game()
                if(teststay.play(random.randint(1,3), 0)):
                        staywins += 1
        print swapwins, staywins

main()
这是一个简化的陈述,如果山羊是1并且选择了2,将其更改为3;如果山羊是2,选择了3,则将其更改为1;如果山羊是3岁,选择的是1岁,则将其改为2岁;等
至于为什么原始代码不起作用,以10000个一组的方式返回所有内容看起来很奇怪,而且很难调试。您的随机数也可以通过randint完成,这也会使您的代码更具可读性。

感谢您的反馈!我真的很喜欢你用对象而不是数组做的事情。
self.chosenDoor = 6-(self.chosenDoor + self.goat)