挑战概率题:冰箱 1 有 30 瓶可乐,冰箱 2 里有 31 瓶, 60 天随机拿走 1 瓶..

2020-07-15 10:45:05 +08:00
 WinG
冰箱 1 有 30 瓶可乐,冰箱 2 里有 31 瓶,60 天内随机在 1 、2 中拿走 1 瓶..,

60 天后冰箱 2 刚好剩下 1 瓶的概率是多少?

据说答错的人极多。
5857 次点击
所在节点    问与答
80 条回复
LemonButSweet
2020-07-15 11:33:38 +08:00
不应该是二分之一吗....选冰箱的问题?
across
2020-07-15 11:34:16 +08:00
哦,错了,61 瓶排列组合,最后一个属于 2 号的比例是 31/61
WinG
2020-07-15 11:38:30 +08:00
@imdong
@duwan

我模拟的也是 0.55 ,不用暴力模拟法,这个概率怎么算?
shiyidi
2020-07-15 11:39:18 +08:00
应该是 1/2,前 59 次不影响结果,最后一次可能为 2:0 、1:1 、0:2,结果为 0+1/3*1/2*1/3
Banxiaozhuan
2020-07-15 11:40:09 +08:00
(0.5) ^ 30
Vegetable
2020-07-15 11:42:12 +08:00
关于程序模拟 0.55 的问题,0.55 对应的是随机选择一个冰箱,1 个冰箱 1 瓶,一个冰箱 2 瓶时,选择他们的可能性相等。而 31/61 考虑的不是冰箱,而是直接拿可乐。
chairuosen
2020-07-15 11:45:07 +08:00
@WinG #23 你如果用 20L 的算法,就是冰箱取空后不换成取另一个冰箱的可乐。则就是我 8L 说的问题
jinhan13789991
2020-07-15 11:45:29 +08:00
是 1/2 啊,要么 “冰箱 2 刚好剩下 1 瓶” 要么 “冰箱 2 刚好剩下不是 1 瓶”
/dog
nuk
2020-07-15 11:51:44 +08:00
这个很好计算啊
按照 11 楼的题目来计算
概率就是 C(30,60)/C(30,61)
实际上就是 31/61
hahastudio
2020-07-15 11:55:58 +08:00
我是这么想的:既然其中一个冰箱拿空了就必然会去拿另一个冰箱,那就是怎么这 61 瓶可乐按什么顺序拿的问题
全排列 61!
固定第二个冰箱里的某一瓶最后拿,其余 60 瓶的排列 60!
第二个冰箱有 31 瓶
那就是 60! * 31 / 61! = 31/61
hahastudio
2020-07-15 11:58:05 +08:00
这样的话,好像等价的问题更好理解:
61 瓶可乐,30 瓶普通的,31 瓶无糖的,随机拿 60 瓶,最后一瓶是无糖的概率 31/61
hicdn
2020-07-15 12:00:25 +08:00
等价转换,箱子里有 30 各红球,31 个白球,每次取一个球。求取 60 次后,箱子里剩一个白球的概率。
wxd92
2020-07-15 12:03:01 +08:00
我来
C(30,31)C(30,30)/C(60,61)
总事件 从 61 个瓶取 60 个
该事件 冰箱 1 30 个全取,冰箱 2 31 个中取 30 个
hicdn
2020-07-15 12:07:25 +08:00
@hicdn C(30,30)C(30,31)/C(60,61) = 31/61
nmdx
2020-07-15 12:08:27 +08:00
相当于一次性拿 60 瓶,最后剩 1 瓶,那么这 1 瓶是 2 号冰箱的概率就是 31/61 了

也可以换个角度,一开始先随机拿出来一瓶,后面 60 天随便怎么拿,保证第一瓶是 2 号冰箱的就行,概率为 31/61

个人意见,仅供参考
SakuraSa
2020-07-15 12:22:03 +08:00
A 冰箱有 a 瓶,B 冰箱有 b 屏,在 A 、B 冰箱中有可乐的冰箱中等概率取一瓶,最后 B 冰箱剩余 1 瓶的概率。

解:
设目标概率函数为: P(a, b)
由题目理解可得:

1. 当 a>0, b>0 时:
P(a, b) = 0.5 * P(a - 1, b) + 0.5 * P(a, b - 1)
2. 当 a=0 或 b=0 时:
P(a, 0) = 0
P(0, b) = 1

题目可由动态规划得:

```python

import functools.lru_cache

@lru_cache
def p(a, b):
if a and b:
return 0.5 * p(a - 1, b) + 0.5 * p(a, b - 1)
else:
return 1 if b else 0
```

时间复杂度 O(a*b)
空间复杂度 O(a*b)

本机运行结果:
```
>> timeit p(30, 31)

0.5512890865042848
578 µs ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```

另外:31/61 = 0.5081967213114754
WinG
2020-07-15 12:23:52 +08:00
@SakuraSa 牛逼!
gtchan13579
2020-07-15 12:27:17 +08:00
最终只有两种结果,要么冰箱 1 剩一瓶,要么冰箱 2 剩一瓶,所以答案 1/2.模拟的是什么鬼,这么简单还需要模拟吗。
WinG
2020-07-15 12:28:36 +08:00
@gtchan13579 二分一是最典型的错误答案
cigarzh
2020-07-15 12:30:09 +08:00
ez

https://www.wolframalpha.com/input/?i=Sum[(60!/((60-i)!*i!)),{i,0,30}]/2^60

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

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

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

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

© 2021 V2EX