[機統] 這兩種同樣的機率 但為什麼方法不同?

看板Math作者 (魯‧排骨宅)時間10年前 (2015/09/09 19:14), 10年前編輯推噓5(5058)
留言63則, 8人參與, 最新討論串1/1
各位高手你們好 是這樣子的 因為我要用程式碼製作一個10%~90%的起床機率 然後計算他花多久被叫起來 但是因為魯蛇我機率弱到爆 被老師電到翻掉 然後老師重新提出兩種方式叫我們修改 在講方法之前 怕誤導大家 先講老師跟我提到的例子 =================================== 我們都知道 硬幣出現正反兩面的機率都是50% 但是要執幾次硬幣 出現正反兩面的機率剛好是50%? 執行10次可能9次反面 1次正面 執行100次可能39次反面 61次正面 所以要一直不斷擲硬幣 直到正反兩面剛好佔全部擲硬幣次數的一半才能停止 換句話說 就是樣本數要夠多才會準 =================================== 回到主題 固定秒數(例如每30秒)叫人起床 總共要叫幾次 對方才會在10%的機率下醒來? 我目前做的方式就跟錯誤的擲硬幣一樣 在10%的機率下(1紅9黑 固定紅球的位子 隨機取亂數 如果亂數值位在紅球就算成功) 我只執行100次就說他有10% 也就是說 假設執行100次 總共累積叫了對方醒來共1632次 但其實醒來的機率只有100/1632=6.12%左右 老師提出兩種方法 1.同範例 增加樣本 把執行100次的次數 拉到200萬次 這樣就會更趨近於10% 2.不用1紅9黑的方式 看程式碼中random的範圍是多少 假設是0~999999999 然後設定10個區段 假設第一區段是0~99999999 第二區段是100000000~199999999...以此類推到第十個區段 然後隨機跑random 如果random值座落在第一區 那就算成功 接著跑一百次 這個出來的結果也會跟第一種方式一樣是10% 我不知道我有沒有完整打出老師的話 但是我想問的是 為什麼第二種方式把隨機取數從固定一個值(1紅9黑) 變成一個範圍(0~99999999) 就能說他也可以做出10%的機率? 另外第二種方式是不是random的預設範圍越大 機率會越準確(10%)? -- 作者 MicroGG (La new總冠軍) 看板 Japan_Travel 標題 [問題] 溫泉旅館的兒童人頭算法?

04/11 16:32,
問問題然後自稱拎背這樣好嗎 有點禮貌ok?
04/11 16:32

04/11 16:34,
骨科大 XD
04/11 16:34

04/11 16:36,
你不懂,我有苦衷,我不說拎杯會被鄉民罵..
04/11 16:36
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.138.238.19 ※ 文章網址: https://www.ptt.cc/bbs/Math/M.1441797271.A.AE2.html

09/09 19:35, , 1F
執行100次可以醒1632次 只有我覺得怪怪的嗎
09/09 19:35, 1F
應該要這麼解釋 第一次 叫了3次才醒來 第二次叫了14次才醒來...然後執行100次 再把叫的次數全部加總

09/09 19:40, , 2F
我倒覺得你應該先找找程式碼哪裡有問題
09/09 19:40, 2F

09/09 19:41, , 3F
嘗試1632次才累積到100次成功,幾乎是五個標準差以
09/09 19:41, 3F

09/09 19:41, , 4F
外哪
09/09 19:41, 4F

09/09 19:42, , 5F
比中樂透還難
09/09 19:42, 5F
應該是說用for loop跑100次 然後loop結束後 總計叫了1632次 但是這樣樣本數太少 我們老師才叫我們作多一點

09/09 19:52, , 6F
執行100次中的每一次都要叫好幾次,叫到醒為止?
09/09 19:52, 6F
對 要叫到醒 如果叫第一次沒醒來 就要等下一個30秒之後再叫一次

09/09 19:55, , 7F
感覺是幾何分布,估個信賴區間之類的
09/09 19:55, 7F
你說我們老師說的第二個方法?

09/09 19:59, , 8F
應該是你用100/1632的算法不太對
09/09 19:59, 8F
我會這樣算是因為 1632是包含叫成功跟失敗的次數 今天要計算出說10%的機率醒來 那就是要 執行次數(例如100次)/累計呼叫次數(叫失敗跟叫成功 例如1632) 還是說 這個想法 跟擲多少次硬幣才會剛好出現正面的機率是50% 不同?

09/09 19:59, , 9F
因為1632裡面每次出現的機率不太一樣
09/09 19:59, 9F
當然 執行這一組100次 跟下一組100次 總計次數絕對不同 ※ 編輯: aiweisen (140.138.238.19), 09/09/2015 20:10:47

09/09 20:01, , 10F
第二次叫有第一次叫沒醒的前提,機率其實會比較小
09/09 20:01, 10F

09/09 20:03, , 11F
至於兩個方法應該是一樣都要跑個幾百萬次會比較準
09/09 20:03, 11F

09/09 20:04, , 12F
應該沒有第二種只要跑幾百次的道理
09/09 20:04, 12F

09/09 20:07, , 13F
伯努利過程中得到1次成功所需要的試驗次數?
09/09 20:07, 13F

09/09 20:07, , 14F
樓上,假設他每次「叫」的成功都是獨立的10%,怎麼
09/09 20:07, 14F

09/09 20:07, , 15F
累積樣本數是沒有關係的啊
09/09 20:07, 15F

09/09 20:08, , 16F
我說樓樓上s大
09/09 20:08, 16F

09/09 20:10, , 17F
那就是s大說的幾何分布, 算一算就好了
09/09 20:10, 17F

09/09 20:10, , 18F
跟「一直丟亂數累積樣本,直到成功一百次停止」是同
09/09 20:10, 18F

09/09 20:10, , 19F
一件事
09/09 20:10, 19F

09/09 20:11, , 20F
當然「最後一次成功就停止」這樣出來的機率應該要比
09/09 20:11, 20F

09/09 20:11, , 21F
二項式分布的10%高一點點,但是不可能差到五個標準
09/09 20:11, 21F

09/09 20:12, , 22F
09/09 20:12, 22F

09/09 20:12, , 23F
所以我強烈懷疑是原po的程式有問題
09/09 20:12, 23F
我演算法大致上是這樣 先用10%的 計數=0 10%陣列={1,0,0,0,0,0,0,0,0,0} for(執行100次){ 繼續=true while(繼續){ 亂數值=產生亂數0~9 計數加1 if(10%陣列[亂數值] is 1){ 繼續=false } else{ skip }//if else end }//while end }//for end 輸出計數值 ※ 編輯: aiweisen (140.138.238.19), 09/09/2015 20:26:32

09/09 20:14, , 24F
...或者是原po把中大樂透頭獎的運氣浪費在這個作業
09/09 20:14, 24F

09/09 20:14, , 25F
上面了 XD
09/09 20:14, 25F

09/09 20:57, , 26F
這就要看你的random number generator有多random了
09/09 20:57, 26F

09/09 20:57, , 27F
感覺已經不是數學的問題了= =
09/09 20:57, 27F

09/09 20:58, , 28F
這樣看起來你的老師比較奇怪 隨機數字就這樣
09/09 20:58, 28F

09/09 20:58, , 29F
不這樣算難道自己捏造? 那不如直接用理論的10%就好
09/09 20:58, 29F

09/09 21:33, , 30F
程式邏輯沒問題,雖然實在是複雜得無謂 XD
09/09 21:33, 30F

09/09 21:34, , 31F
原po你沒有多跑幾次嗎?每次都跟10%差很多?
09/09 21:34, 31F

09/09 21:36, , 32F
一千六百個樣本的二項式分布理論值是 160 +- 12
09/09 21:36, 32F

09/09 21:38, , 33F
大樂透總是會有人中的,但是如果同一個人連中三四期
09/09 21:38, 33F

09/09 21:38, , 34F
那就...
09/09 21:38, 34F

09/09 22:13, , 35F
我照你的演算法自己寫了一支一模一樣的程式,跑了三
09/09 22:13, 35F

09/09 22:14, , 36F
十次,數字都集中在1000左右,還沒看到低於800或高
09/09 22:14, 36F

09/09 22:14, , 37F
過1200的。
09/09 22:14, 37F

09/09 22:15, , 38F
也就是差不多都在兩個標準差裡面
09/09 22:15, 38F

09/09 22:40, , 39F
n趨近無窮就會機率收斂到0.5
09/09 22:40, 39F
我目前是按照老師第一個方法 增加樣本數 目前是打算讓他跑兩百萬次 按照一萬比要跑5分鐘 兩百萬大概要花17小時左右個 只是原本在懷疑說 為什麼老師說跑第二種方法就不用執行很多次就可以 但就大家看來 還是一樣要執行很多次才會精準 話說我們老師說的第二種方式 是你們說的幾何分佈是嗎? ※ 編輯: aiweisen (140.138.238.19), 09/09/2015 22:48:32

09/09 22:55, , 40F
一萬次要5分鐘 @@? 我用 perl 跑2百萬筆也只需幾秒
09/09 22:55, 40F

09/10 00:12, , 41F
你用什麼語言寫在什麼東西上面跑啊?
09/10 00:12, 41F

09/10 00:15, , 42F
python在普通的筆電上面,一千萬次只要兩秒
09/10 00:15, 42F

09/10 00:22, , 43F
另外你們老師說的第二種方式跟你正在用的完全等價
09/10 00:22, 43F

09/10 00:24, , 44F
我相信他給建議的時候根本沒有仔細想過你的問題 -_-
09/10 00:24, 44F
抱歉 現在才回 我是用JAVA寫的 的確程式有點問題 因為我在while中間有加入一個sleep(1) 每次一毫秒的函式 當時只是要先記錄喚醒次數 然後在與固定時間做相乘就好 忘記當初為什麼我要這麼做 最後放個變數去紀錄 幾秒就跑完2百萬筆

09/10 09:22, , 45F
應該說你的問題本身就是一個幾何分布的問題
09/10 09:22, 45F

09/10 09:22, , 46F
建議先把程式問題找出來,不然17小時會白跑
09/10 09:22, 46F

09/10 09:26, , 47F
可以講一下skip的功能嗎 幫你檢查一下程式邏輯
09/10 09:26, 47F

09/10 09:30, , 48F
做一百次就是負二項分布,平均值900,標準差94.87
09/10 09:30, 48F

09/10 19:57, , 49F
skip是「跳過以下回到while開頭」
09/10 19:57, 49F

09/10 19:58, , 50F
不過他下面沒有了,所以那個skip只是寫心酸的
09/10 19:58, 50F

09/10 20:01, , 51F
邏輯本身正確,但是效率和結果都很有問題,所以應該
09/10 20:01, 51F

09/10 20:01, , 52F
是程式碼裡面有出了毛病
09/10 20:01, 52F

09/11 08:17, , 53F
擲硬幣實驗不應該是 "直到正反面次數各佔一半才停",
09/11 08:17, 53F

09/11 08:17, , 54F
這樣的實驗無法證明什麼. 例如擲一個公正骰子, 也可
09/11 08:17, 54F

09/11 08:18, , 55F
以擲到出現么點與非么點的次數才停止.
09/11 08:18, 55F

09/11 08:19, , 56F
你的問題有兩種正確方式:
09/11 08:19, 56F

09/11 08:20, , 57F
其一是預定叫醒次數, 看要叫幾次才能達到. 如原文中
09/11 08:20, 57F

09/11 08:21, , 58F
說的叫醒100次. 這是 "負二項實驗".
09/11 08:21, 58F

09/11 08:22, , 59F
另一種是預定 "叫" 的次數, 例如 2000次, 看能叫醒
09/11 08:22, 59F

09/11 08:22, , 60F
幾次. 這是典型的 "二項實驗".
09/11 08:22, 60F

09/11 08:23, , 61F
不過, 以 "叫醒" 問題來說, 它是否得合 二項/負二項
09/11 08:23, 61F

09/11 08:24, , 62F
實驗的要求, 是需要考慮的. 因為叫醒的機率可能前後
09/11 08:24, 62F

09/11 08:25, , 63F
有變化, 而且也可能有序列相關存在.
09/11 08:25, 63F
好 謝謝你提供的問題 我在跟同學討看看 ※ 編輯: aiweisen (140.138.150.27), 09/14/2015 12:38:55 ※ 編輯: aiweisen (140.138.150.27), 09/14/2015 12:40:21
文章代碼(AID): #1Ly1INhY (Math)