看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《kyoiku (生死間有大恐怖)》之銘言: : 某遊戲中武器衝星規則如下: : 1. 武器初始 0 星,每次衝星需消耗一張武卷。 : 2. 武器 0 星衝 1 星之機率為 1/2。 : 3. 衝星成功則武器星數變為 1 星,若否則仍是 0 星。 : 求武器 0 星衝 1 星平均需用幾張武卷? 想請教大家一個問題。 我們都知道遊戲中武器衝星可以一直衝上去,例如承上面 3 點還可以再有: 4. 武器 1 星衝到 2 星之機率為 40%,失敗則降為 0 星。 5. 武器 2 星衝到 3 星之機率為 30%,失敗則降為 1 星。 6. 武器 3 星衝到 4 星之機率為 20%,失敗則降為 2 星。 7. 武器 4 星衝到 5 星之機率為 10%,失敗則降為 3 星。 想求武器從 0 星衝 5 星平均需用幾張武卷? 當然這用數學可以準確算出,但是牽涉到機率論中的馬可夫鏈和線代對角化。 我算過,但對角化特徵值數字不好要用 MATLAB 算近似值, 然後當然求出來的期望張數也是近似值,無意義。 所以我想用程式直接跑出 "期望張數" 的近似值就好比較省力。 我的問題是:例如,如何用亂數函式 rand() 來呈現出機率中的 30% 呢? rand() 的值是從 0 ~ 32767 公平挑選出一整數,每個整數被挑到的機會是 1/32768, 所以可以用 if(rand()>16383) 來呈現 50%。 有想過用 if((rand()%10)+1>7) 來呈現 30%, 不過 (rand()%10)+1 並沒有公平挑選 1~10 這 10 個整數,QQ。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.229.246.251
james732:0星至5星的理論張數是多少呢? 04/15 18:14
azureblaze:(float)rand() / 32767.0f <= 0.3f? 04/15 18:15
LPH66:可參考我最近這篇文章 #1DSuIH6B 04/15 18:17
ddavid:樓上的方法是不行的,真的很在意的話就只取到32759這樣,當 04/15 18:17
ddavid:產生出大於32759的值就重取,反正機率很低。 04/15 18:17
LPH66:插隊不好意思 ._. 04/15 18:18
ddavid:我說的不行是二樓這樣,被插推了XD 04/15 18:18
ericinttu:我想問: rand()%2>0 跟 rand()>16383 有什麼不同? 04/15 18:36
ericinttu:後者真的會比前者準嗎? 04/15 18:36
tropical72:if(double(rand())/RAMD_MAX <= 0.3) // 30%; 可嗎? 04/15 18:55
ddavid:就這個例子來說是沒有什麼不同,但是當你要取到x個值,用後 04/15 18:55
ddavid:面的寫法就要寫(x-1)個if,而且你還要事先把每個32767/x*i 04/15 18:56
ddavid:都寫出來(或至少算32767/x然後又額外花時間一次次加)給if 04/15 18:57
ddavid:用XD 04/15 18:57
ddavid:rand()直接產生出來的值是整數這件事才是重點,不管你怎樣 04/15 18:58
ddavid:掛(float)或(double)去偽裝也不能改變它的值只會落在格點上 04/15 18:58
ddavid:而非連續函數這件事 04/15 18:59
ddavid:用rand()可以產生0到9而你想要的值是0, 1, 2為例,你再怎樣 04/15 19:00
ddavid:掛(double),除起來也只會是0.0 0.1 0.2 ~ 0.9,三種值之中 04/15 19:01
ddavid:始終有一個會分到4個而另兩個只能分到3個 04/15 19:02
james732:我跑出來的答案是730,答案是這個嗎? 04/15 19:08
ericinttu:樓上算出期望值還是跑模擬的? 04/15 19:13
james732:模擬出來的 不知道這樣對不對 XD 04/15 19:13
ddavid:話說如果真的要強一點的亂數又不想自己寫,有用.Net的話 04/15 19:16
ddavid:RNGCryptoServiceProvider可以考慮看看XD 04/15 19:16
kyoiku:啥是.NET,@@? 目前剛看到第五章物件,太深入的還不會 04/15 19:20
kyoiku:我自學C++的目的主要是好奇程式在幹嗎和要解數學問題 04/15 19:22
ddavid:別太在意,等你真的用得上它時你應該就有實力知道它是啥了 04/15 19:27
ddavid:沒用.Net還是可以直接去找人家寫好的Library來用就行了 04/15 19:32
ddavid:如果對數學跟程式真的非常有興趣,也可以自己去讀Knuth的 04/15 19:34
ddavid:The Art of Computer Programming, volume 2裡面的亂數產生 04/15 19:34
ddavid:器看看,然後再去看密碼學裡面用的版本XD 04/15 19:35
ddavid:前者是.Net裡面Random這class實作的演算法這樣 04/15 19:35
DrStein:衝失敗不是暴武回到零星嗎 怎只後退一星? 04/15 19:54
LPH66:其實是看遊戲設定... 04/15 19:57
yoco315:衝失敗不是整把武器消失嗎 怎只退後一星? 04/15 21:10
KanoLoa:衝失敗不是整個角色重置嗎 怎...... 04/15 21:19
ddavid:衝失敗不是玩家砍掉重練嗎,怎...... 04/15 21:35
james732:回到0星的結果約1476.18次,比想像中的還要少 XDD 04/15 22:03