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