VBA新手教程 抽卡模擬實戰(3)

2021-10-08 00:07:14 字數 2786 閱讀 9614

今日作業

下期不定期更新預告

今日毒奶

墨跡在最後

從頭開始學習一門程式語言,如果不能設定乙個明確的目標:我要用他來幹什麼,解決什麼問題。那麼整個過程可以說是相當痛苦了,而且還很快會忘!所以今天咱們就來實際解決乙個問題:用蒙特卡洛法實現簡易的模擬抽卡功能!

複習個屁都鴿了乙個多月了,忘了之前講的啥了,自己翻翻前面的都不難!

(喜愛爐石的小朋友看過來)

做乙個**抽卡的功能:假設所有的卡牌種類數為s,抽取每張卡牌的概率是一定的即1/s,想求在有放回的抽取了n張卡牌後,獲得的卡牌種類的期望x是多少。

我猜此刻數學系的小夥伴兒已經帶著一臉不屑拿起筆開始算了,好的,咱們比誰快!

蒙特卡洛法

很low的介面

如圖,填寫如下資訊:

總卡牌數、抽卡次數、模擬次數,程式會讀取相應值。

最後的期望顯示在cells(6,」c」)

不用整理思路,直接寫**

1、 先定義變數名稱型別,然後把數值讀進去。為了方便理解咱們還是low一點直接用漢字。

a) 定義乙個手裡的牌庫,當然種類需要跟總卡牌數一樣多。

b) 然後每抽到一張牌,就更新手牌庫,對應的種類就賦值為1,代表已擁有。

c) 在抽取了「抽卡次數」張卡牌後,記錄當前擁有的卡牌數:遍歷手牌,如果為1,記錄值。新增到乙個總計值中,回頭都模擬完了除以模擬次數就是期望值。

d) 以上bc兩個過程重複「模擬次數」次,記得每次重置手牌。

3、 繼續寫**

a) 定義了乙個總計值,但是模擬次數多了long也可能會溢位,管不了那麼多了!

b) 定義了手牌,長度匹配總卡牌數,但是需要在後面redim(重新定義)一下陣列長度,如果直接寫成dim 手牌(1 to 總卡牌數) as interger會報錯,因為dim不支援定義動態長度,鍋都在「總卡牌數」是乙個變化的值!

c) 兩層的迴圈,第一層:模擬次數;第二層,抽卡的次數。這個理解吧!

d) 每一次模擬的時候,清空手牌,erase擦掉就可以啦!erase只可以對陣列使用,意義為初始化陣列(理解成「擦掉」也是可以的。)

e) 這裡有乙個知識點,就是erase和redim的順序。我們在dim 手牌() as integer時,定義的是乙個非固定陣列,所以在erase這個陣列時,會重置到這個最開始定義的情況,陣列長度就變為了0,所以需要重新redim一下陣列長度。

4、 最關鍵的邏輯出現了!

a) 定義了乙個臨時的整數tempint,一會用來存放隨機出來的卡牌id。

b) randomize,重置隨機數種子。如果不寫這局,很有可能你每次執行隨機出來的第乙個數都是一樣的。(不過影響不大)。

c) rnd隨機數,系統會自動生成乙個[ 0,1 )左開右閉區間的隨機數。所以rnd * 100,生成隨機數的區間就變成了[ 0,100 ),所以rnd * 100 + 1就變成了[ 1,101 ),因為取不到101這個最大值,所以當用int函式取整時,會把小數部分都丟掉,我們就完成了在[ 1,100 ]區間隨機選取整數值的功能。

d) 其他部分自行看**理解!已經沒生知識點了!

5、 結果:直接上圖!

蒙特卡洛法的結論:經過1000次的模擬,在卡片種類在100種情況下,每次抽取100張卡平均會得到63.322種不同型別的卡牌。

6、 其他模擬條件可以隨意更改。

(電腦宕機了)

注意1、 對於蒙特卡洛法來說,模擬次數越多就越接近真實結果。

2、 但永遠不會得到乙個準確結果,滿足精度要求即可。

3、 看你自己電腦效能,模擬次數別手賤填太多,容易宕機。

1、 自己照著寫一遍,然後再默寫一遍,你就無敵了!

2、 可以拓展一下,在總卡牌數一定、模擬次數一定時,設定分別抽取不同的卡牌數,然後模擬出不同的對應結果。可以思考一下如何取值,結果如何呈現。

3、 可以試著開發一下解決其他問題的模擬工具,比如買彩票!假設乙個人每天買一注,平均需要連續購買多少天才能中一等獎!平均花費多少錢!(算完你就再也不碰了戒賭)

1、 再講乙個while迴圈,這個真是沒辦法確實不能完全被for迴圈替代。

2、 寫了一堆bug,咋整?我自己看著都懵!(沒錯,講解一下除錯方法。)

3、 以前的預告留著挖坑了,下期再介紹一些字串處理的實戰,幫你把興趣搞上來!

宇宙可能就是上帝擲骰子模擬出來的,蒙特卡洛無敵!

終於可以開通打賞了哈哈哈哈!我覺得自己要致富了!

你的4塊3毛8是我前進的動力!

然鵝如果你對我有不滿有批評我還是不會讓你上牆的!

貪心 抽卡遊戲

微眾某道筆試題。貪心演算法。排個序就行 排序思路 貪心。把卡片上額外次數最多的卡片防在最前面,如果額外次數一樣多,那麼金額大的放在前面。collections.sort list,e1,e2 e1.exchance e2.exchance e2.exchance e1.exchance e2.mon...

抽卡遊戲 2021 1 12

本題的靈感 於乙個古典的概率模型。alice 在乙個卡池裡抽卡,裡面有 x 張 s 卡和 y 張 a 卡。alice 每次會不放回的隨機從卡池中抽出一張卡。bob 在一旁看 alice 抽卡並對每次的結果進行 若卡池裡 s 卡的數量多於 a 卡,bob 會猜 alice 抽出 s 卡。反之則會猜測 ...

測試35 抽卡

狀態設計 成環使首尾相連 為何連成環?單純鏈式地跑,狀態是無限的。但是因為狀態是首位相接的,所以可以連成環,在環上可以無限地跑 最終狀態是f 0,m 而不是f 0,0 0,m 沒開始,0,0 已開始。處理環 1 高斯消元。但是是取模意義下的,而且複雜度太大會t 2 係數遞推。相當於手動高斯了。因為t...