linux下shell常用指令(linux决胜21点中三门问题shell实现)
linux下shell常用指令(linux决胜21点中三门问题shell实现)#!/bin/bash #chhbll #532088799@qq.com function rand(){ min=$1 max=$(($2-$min 1)) num=$(date %s%N) echo $(($num%$max $min)) } #随机制造三道门,其中两道门中的值是0,一扇门中的值是1 for ((i=1 b=1 h=1;i<1000;i )) do while true do rndarr[0]=$(rand 0 1) rndarr[1]=$(rand 0 1) rndarr[2]=$(rand 0 1) sum=$(( ${rndarr[0]} ${rndarr[1]} ${rndarr[2]})) if [ $sum -eq 1 ];then break fi done #随机选择几号门 rndch
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,自己打开的那扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
这个问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
个人想法分析游戏阶段:
- 参与者随机选择
- 主持人打开一扇门(门后是羊)
- 参与者是否更换选择
当时自己的想法是:参与者第一次选中的概率是三分之一,当主持人打开一扇门(门后是羊)之后,参与者选中的概率是二分之一,换与不换之间不存在直接的关系。
自己也看了一下其他人对这类的问题的分析方法,理论上来说确实是更换选择的选中概率要大一点。为了打消自己的疑虑,通过shell编程来实现“三门问题”的具体实现。
shell建模- 创建长度为3的数组
- 对数组中元素进行随机赋值,赋值区间为0-1之间的整数(只有0 1),保证数组中有且仅有一个元素为1,剩余两个为0(模拟门后的汽车与羊)
- 随机选择一个元素
- 从剩余的两个元素中排除掉一个值为0的元素
- 将初次选择的元素值和更换选择之后的元素值与1进行,计算分别选中的概率。
#!/bin/bash #chhbll #532088799@qq.com function rand(){ min=$1 max=$(($2-$min 1)) num=$(date %s%N) echo $(($num%$max $min)) } #随机制造三道门,其中两道门中的值是0,一扇门中的值是1 for ((i=1 b=1 h=1;i<1000;i )) do while true do rndarr[0]=$(rand 0 1) rndarr[1]=$(rand 0 1) rndarr[2]=$(rand 0 1) sum=$(( ${rndarr[0]} ${rndarr[1]} ${rndarr[2]})) if [ $sum -eq 1 ];then break fi done #随机选择几号门 rndch=$(rand 0 2) #随机选择的门中的值 choice=${rndarr[${rndch}]} #选择打开的门 if [ ${rndch} -eq 0 ];then if [ ${rndarr[0]} -eq 1 ];then b=$(( $b 1 )) else h=$(( $h 1 )) fi elif [ ${rndch} -eq 1 ];then if [ ${rndarr[1]} -eq 1 ];then b=$(( $b 1 )) else h=$(( $h 1 )) fi elif [ ${rndch} -eq 2 ];then if [ ${rndarr[2]} -eq 1 ];then b=$(( $b 1 )) else h=$(( $h 1 )) fi fi done bb=`echo "scale=4;$b/1000"|bc` hh=`echo "scale=4;$h/1000"|bc` echo "不更换之前的选择,选对次数为$b次,正确率=$bb '(一共测试1000)'" echo "更换之前的选择,选对次数为$h次,正确率=$hh'(一共测试1000)'" 运行结果
运行一次测试1000次,共计运行4次: