Re: [問題] 程式跑的"武器衝星期望張數"怪怪的

看板C_and_CPP作者 (生死間有大恐怖)時間14年前 (2011/04/15 18:03), 編輯推噓12(12027)
留言39則, 10人參與, 最新討論串2/3 (看更多)
※ 引述《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

04/15 18:14, , 1F
0星至5星的理論張數是多少呢?
04/15 18:14, 1F

04/15 18:15, , 2F
(float)rand() / 32767.0f <= 0.3f?
04/15 18:15, 2F

04/15 18:17, , 3F
可參考我最近這篇文章 #1DSuIH6B
04/15 18:17, 3F

04/15 18:17, , 4F
樓上的方法是不行的,真的很在意的話就只取到32759這樣,當
04/15 18:17, 4F

04/15 18:17, , 5F
產生出大於32759的值就重取,反正機率很低。
04/15 18:17, 5F

04/15 18:18, , 6F
插隊不好意思 ._.
04/15 18:18, 6F

04/15 18:18, , 7F
我說的不行是二樓這樣,被插推了XD
04/15 18:18, 7F

04/15 18:36, , 8F
我想問: rand()%2>0 跟 rand()>16383 有什麼不同?
04/15 18:36, 8F

04/15 18:36, , 9F
後者真的會比前者準嗎?
04/15 18:36, 9F

04/15 18:55, , 10F
if(double(rand())/RAMD_MAX <= 0.3) // 30%; 可嗎?
04/15 18:55, 10F

04/15 18:55, , 11F
就這個例子來說是沒有什麼不同,但是當你要取到x個值,用後
04/15 18:55, 11F

04/15 18:56, , 12F
面的寫法就要寫(x-1)個if,而且你還要事先把每個32767/x*i
04/15 18:56, 12F

04/15 18:57, , 13F
都寫出來(或至少算32767/x然後又額外花時間一次次加)給if
04/15 18:57, 13F

04/15 18:57, , 14F
用XD
04/15 18:57, 14F

04/15 18:58, , 15F
rand()直接產生出來的值是整數這件事才是重點,不管你怎樣
04/15 18:58, 15F

04/15 18:58, , 16F
掛(float)或(double)去偽裝也不能改變它的值只會落在格點上
04/15 18:58, 16F

04/15 18:59, , 17F
而非連續函數這件事
04/15 18:59, 17F

04/15 19:00, , 18F
用rand()可以產生0到9而你想要的值是0, 1, 2為例,你再怎樣
04/15 19:00, 18F

04/15 19:01, , 19F
掛(double),除起來也只會是0.0 0.1 0.2 ~ 0.9,三種值之中
04/15 19:01, 19F

04/15 19:02, , 20F
始終有一個會分到4個而另兩個只能分到3個
04/15 19:02, 20F

04/15 19:08, , 21F
我跑出來的答案是730,答案是這個嗎?
04/15 19:08, 21F

04/15 19:13, , 22F
樓上算出期望值還是跑模擬的?
04/15 19:13, 22F

04/15 19:13, , 23F
模擬出來的 不知道這樣對不對 XD
04/15 19:13, 23F

04/15 19:16, , 24F
話說如果真的要強一點的亂數又不想自己寫,有用.Net的話
04/15 19:16, 24F

04/15 19:16, , 25F
RNGCryptoServiceProvider可以考慮看看XD
04/15 19:16, 25F

04/15 19:20, , 26F
啥是.NET,@@? 目前剛看到第五章物件,太深入的還不會
04/15 19:20, 26F

04/15 19:22, , 27F
我自學C++的目的主要是好奇程式在幹嗎和要解數學問題
04/15 19:22, 27F

04/15 19:27, , 28F
別太在意,等你真的用得上它時你應該就有實力知道它是啥了
04/15 19:27, 28F

04/15 19:32, , 29F
沒用.Net還是可以直接去找人家寫好的Library來用就行了
04/15 19:32, 29F

04/15 19:34, , 30F
如果對數學跟程式真的非常有興趣,也可以自己去讀Knuth的
04/15 19:34, 30F

04/15 19:34, , 31F
The Art of Computer Programming, volume 2裡面的亂數產生
04/15 19:34, 31F

04/15 19:35, , 32F
器看看,然後再去看密碼學裡面用的版本XD
04/15 19:35, 32F

04/15 19:35, , 33F
前者是.Net裡面Random這class實作的演算法這樣
04/15 19:35, 33F

04/15 19:54, , 34F
衝失敗不是暴武回到零星嗎 怎只後退一星?
04/15 19:54, 34F

04/15 19:57, , 35F
其實是看遊戲設定...
04/15 19:57, 35F

04/15 21:10, , 36F
衝失敗不是整把武器消失嗎 怎只退後一星?
04/15 21:10, 36F

04/15 21:19, , 37F
衝失敗不是整個角色重置嗎 怎......
04/15 21:19, 37F

04/15 21:35, , 38F
衝失敗不是玩家砍掉重練嗎,怎......
04/15 21:35, 38F

04/15 22:03, , 39F
回到0星的結果約1476.18次,比想像中的還要少 XDD
04/15 22:03, 39F
文章代碼(AID): #1Dg1VxbS (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Dg1VxbS (C_and_CPP)