Re: [闲聊] 机率大师请进

楼主: arrenwu (键盘的战鬼)   2022-08-01 20:36:13
※ 引述《smart0eddie (smart0eddie)》之铭言:
: 神域的泳装活动
:
: 无课可以拿114颗抽奖球
: 课长可以拿202颗抽奖球
:
: 一池30球 一颗彩球
: 取后不放回
: 出彩球可换池
: 彩球有未知机率获取号码牌
: 4颗彩球必定获取号码牌
:
: 30个号码各自对应奖项
: 其中只有一个是正妹的泳装造型
:
: 试求无课与课长有泳装穿的机率
:
: 这策划的脑子在想什么
:
: → smart0eddie: 好问题 08/01 19:31
: → smart0eddie: 可能要分两种模式算 08/01 19:31
: → smart0eddie: 照常理应该是连四颗空的才会保 08/01 19:32
: → smart0eddie: 抽球来抽号码⊂(・ω・*⊂) 08/01 19:34
那就按照“连四颗空才会保”,也就是你如果有2颗空的彩球,第3颗抽到号码,
你手头所有的彩球就会被清空。
然后还有一个机率不太清楚的是─抽到彩球后,得到号码的机率是多少?
这个要用手得出一个closed form 还真是满痛苦的
https://i.imgur.com/fzuv898.jpg
所以我写了个蒙地卡罗的模拟程式,是假设彩球给号码的机率在 5%~50% 之间不等的结果
这是无课的结果 (横轴是每个彩球给号码的机率, 纵轴是抽到泳装的机率)
https://i.imgur.com/EgsCxcD.jpg
这是有课的结果
https://i.imgur.com/3xytaez.jpg
图上浅紫色的部份是 95% 信赖区间的范围
这结果看起来还真不是太舒服
不过我也不太确定我程式有没有写错,所以我把python的程式码附在下面:
import matplotlib.pyplot as plt
from concurrent.futures import ProcessPoolExecutor
import numpy as np
import random
n_trial = 640000
p_values = np.linspace(.05,.5,20)
def prob_win(p):
results = []
for _ in range(n_trial):
result = 0
balls_left = 202
balls_in_pool = 30
color_balls_failed = 0
while balls_left > 0:
balls_left -= 1
if random.randint(1,balls_in_pool) == 1:
# got a colored ball
color_balls_failed += 1
if color_balls_failed == 4 or random.random() < p :
# got a number
color_balls_failed = 0
if random.randint(1,30) ==1:
result = 1
break
# reset the pool
balls_in_pool = 30
else:
balls_in_pool -= 1
results.append(result)
return np.mean(results)
if __name__ == '__main__':
with ProcessPoolExecutor(max_workers=12) as executor:
p_results = [res for res in executor.map(prob_win, p_values)]
z = 1.96
p_results = np.array(p_results)
upper_bnd = (n_trial*p_results + z**2/2 +
z*np.sqrt(z**2/4+n_trial*p_results*(1-p_results)) ) / (n_trial+z**2)
lower_bnd = (n_trial*p_results + z**2/2 -
z*np.sqrt(z**2/4+n_trial*p_results*(1-p_results)) ) / (n_trial+z**2)
print(p_results)
plt.plot(p_values, p_results,'-o')
plt.fill_between(p_values,lower_bnd, upper_bnd,color='b', alpha=.1)
作者: showwhat2 (华仔)   2022-08-01 20:40:00
推、推!
作者: smart0eddie (smart0eddie)   2022-08-01 20:43:00
课长才 20% 好坑
作者: harryron9 (两个世界)   2022-08-01 20:44:00
这写法是彩球出的号码会重复的情况 看起来没啥问题
作者: comedyc8c8c8 (后空翻山越岭)   2022-08-01 20:49:00
第一张图后面的背景484色色的阿?我需要连结好研究机率
作者: a29985816 (萧风)   2022-08-01 20:55:00
可以直接random.randint(1,30)来当这次的池要花几颗来拿到彩球 剩余球数不足的话就不进后面拿彩球的计算第一颗拿到的机率跟第三十颗拿到的机率都是1/30然后跑平行随机的时候最好先call random.seed()重新产生种子,不然子程式可能会继承主程式的种子码导致产生一样的随机数
作者: smart0eddie (smart0eddie)   2022-08-01 21:35:00
玩手游学模拟(?
作者: shirleyEchi (雪米菓)   2022-08-02 01:53:00
难怪资工系比数学系热门 突然懂了什么

Links booklink

Contact Us: admin [ a t ] ucptt.com