※ 引述《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)