今天听说一个玄学算法,写了一下,确实玄学?

2022-10-03 00:55:35 +08:00
 estk

假设有 3 个门编号分别为 0 ,1 ,2 ,其中只有 1 个门后面有奖品 主持人先打开一个不存在奖品的门,剩下两个门你随机打开一个,中奖概率是多少? 答案不是 50% 算法写的也确实不是,是写得不对吗?

(async ()=>{
  let gotTimes = 0
  let missTimes = 0
  let failTimes = 0
  let testTimes = 100000
  while( --testTimes > 0) {
    const targetGateNo = parseInt(Math.random()*10**10)%3 // 0/1/2
    let gates = []
    for (let i=0; i<2; i++) {
      gates.push(i===targetGateNo)
    }
    const randomNo = parseInt(Math.random()*10**10)%3 // 0/1/2
    if (gates[randomNo]) {
      failTimes++
      continue
    }
    let randomNo2 = parseInt(Math.random()*10**10)%3
    while(randomNo2===randomNo) {
      randomNo2 = parseInt(Math.random()*10**10)%3
    }
    if (gates[randomNo2]) {
      gotTimes ++
      continue
    }
    missTimes ++
  }
  console.log(gotTimes/(gotTimes+missTimes), gotTimes, missTimes)
})()

剩下两个选一个,下意识觉得概率应该 50%才对,但是执行后是 0.28 左右

7354 次点击
所在节点    程序员
46 条回复
JohnBull
2022-10-03 10:53:51 +08:00
条件概率问题,通常有点反直觉
mongcici
2022-10-03 11:31:47 +08:00
@leafin 这个问题我一直是想不通。按你说的感觉是这样,但是假定,我事先没有去随机选择一扇门,这时候主持人打开一定是假门的门 C ,剩下 ab ,1 真 1 假,这个时候我去选择 a 是真门的概率是多少呢?我感觉应该是 50%。
我感觉 abc 本来都是 67%,当主持人打开了一扇假门 c ,剩下的 ab 的概率应该都变到 50%。不管我事先有没有选择 A 。
eason1874
2022-10-03 11:33:50 +08:00
@estk #6
@yehoshua #17 三门问题数学可证,换门确实是三分之二,我也写过代码验证,次数少会有偏差,100 万次以上基本就稳定了

@heavymetals #19 这个问题的代码其实几行就能写出来了

if SelectNum === WinNum then 第一次选中+1
else {
// 如果第一次没选中,那么 WinNum 在剩下的两个选项中
// 而这时主持人又给你排除掉一个错误选项,等于同时排除了两个错误选项
// 此时换门必中,不需要再写去掉错误选项的代码,加一即可
换门选中+1
}

通过代码就能理清其中逻辑:只要第一次选错了,那么换门必中,第一次选错的概率是三分之二,所以换门选中概率也就是三分之二
msg7086
2022-10-03 11:44:04 +08:00
@mongcici 主持人不一定打开门 C ,也可能打开门 A 或者门 B 。
你事先选择的一扇门限制了主持人只能打开假门,而不允许打开真门(因为违反游戏规则了)。
如果主持人根本不知道哪扇门是真的假的,闭着眼睛随便去掉一扇,那么你说的就是对的。

这里利用的就是主持人拥有你所不拥有的知识来造成概率的不同。
dvsilch
2022-10-03 11:46:51 +08:00
就跟抽签一样,知道前面抽的签没中,中的概率就被平均到剩余的签了
msg7086
2022-10-03 11:52:14 +08:00
@mongcici 也可以换一个等价的游戏规则。
你先选一扇门 A ,然后主持人随机去掉一个门 C ,并且不告诉你 C 是真门还是假门。
但是告诉你,如果 B 是真门,那么你选 B 可以获奖;但如果 C 是真门,那么你选 B 也可以获奖。
这样是不是就很容易看出换门 67%不换 33%了。
wukangave
2022-10-03 14:24:06 +08:00
大哥你的代码写错了
“for (let i=0; i<2; i++) {”
循环条件应该是 i<=2
因为你写错了,数组里只有两个元素,然后 js 又没有数组溢出检查,所以当随机生成的奖品在第三个门的时候,玩家永远是错的。
你把循环条件改对,概率就是 50%了
Kroos
2022-10-03 15:27:51 +08:00
先不考虑代码怎么写,按照你的描述只能是 50%的答案。

因为已经打开一个没有奖品的门了,剩下二选一相当于一个条件概率。
yehoshua
2022-10-03 15:48:37 +08:00
@eason1874 三门这个问题甚至不需要用次数验证,数学可以直接算的,很简单的概率论问题。只不过描述上让人迷惑,换成数学描述就很简单了。最终还是回到了概率论-_-
leafin
2022-10-03 16:02:48 +08:00
@estk 我也懒得改你的代码了,我重新写了一份,包含原本的三门和主贴里描述的三门,你运行一下看吧

(() => {
const rand3 = () => Math.floor(Math.random()*3)%3
const next = (cur) => (cur+1)%3

let noswap_wins = 0 // 维持原始选择
let swap_wins = 0 // 交换选择
let reselect_wins = 0 // 重新随机选择(主贴所描述的三门)
const loop = 100000

for(let i=0; i<loop; i++){
const goal_door = rand3() // 有奖品的门
const selected_door = rand3() // 参赛者选择的门
let opened_door, swap_door // 主持人打开的门,可以交换的门

// 主持人在未选择的两扇门中打开一扇没有奖品的门,并设置另一扇门为交换门
opened_door = next(selected_door)
if(opened_door !== goal_door){
swap_door = next(opened_door)
}else{
swap_door = opened_door
opened_door = next(opened_door)
}

// 如果这时候在两扇未开的门中重新随机选择(主贴所描述的三门)
let reselected_door = next(opened_door)
if(Math.random() > 0.5)
reselected_door = next(reselected_door)

// 统计结果
if(selected_door === goal_door)
noswap_wins++
if(swap_door === goal_door)
swap_wins++
if(reselected_door === goal_door)
reselect_wins++
}

console.log("不交换:" + noswap_wins/loop + " / 交换:" + swap_wins/loop + " / 重新随机选:" + reselect_wins/loop)
})()
mm163
2022-10-03 16:03:18 +08:00
其实就是一次机会 1/3 ,两次机会 2/3 ,该题实际给 2 次机会
leafin
2022-10-03 16:03:42 +08:00
@leafin 为什么我的空格没有了,这、
Jooooooooo
2022-10-03 16:29:30 +08:00
其实换门是等价于你直接一开始选两扇门, 那概率自然比不换选一扇门概率高.
lifansama
2022-10-03 19:51:54 +08:00
主持人打开的门并不随机啊😂
Leviathann
2022-10-03 20:16:46 +08:00
开两次,对应 两种有+没有的情况 / 两种没有 + 有的情况 / 一种没有 + 没有的情况
第一扇门开了没东西,其实消除了 两个 有 + 没有的情况,只剩下 没有 + 有 * 2 和 没有 + 没有 * 1
也就是 2 / 3
mongcici
2022-10-03 23:11:43 +08:00
@msg7086 谢谢耐心解答,我再好好想想看。
Aloento
2022-10-03 23:52:23 +08:00
薛定饿了么 有讲这个概率问题
Constantping
2022-10-04 01:21:26 +08:00
@mongcici 如果選擇不換,就只能選擇唯一正確的那扇( 1/3 )
如果選擇換,就可以選擇錯誤的那兩扇門( 2/3 )
callmesmc
2022-10-04 01:30:54 +08:00
问题是主持人不是随机选的,是在剩下的门里面给排掉一个,如果换门,换的就是已经排掉一个的那一组,概率当然上升了
nuk
2022-10-04 01:33:07 +08:00
主持人的选择让另外那个门熵降低了,所以两个门的熵值显然不一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX