(廢文) 從一張無聊的MEME看Simulation的強大之處
不知為何最近我的社交群組都在流傳一個堪稱 ” 一分鐘淘汱掉 100 人 ” 的面試題: 筆者驟眼看了一眼題目,便笑而不語,這豈不是普通的機率問題,可是當我開始思考了 10 秒後,我不禁後悔了,這根本沒有想像中簡單!還好,老子還有一部強大的電腦幫我做運算開掛,不然我一分鐘我自己也算不出來。 於是,我利用一分鐘的時間用 Python 寫幾行簡短的程式碼做 Simulation ,等待數秒,結果就出來了,就是 10 個人。整個過程根本無需人腦的運算,只需要把問題設計好給電腦作運算就好了。 方法大概就是制作N個平行空間,為什麼是N?那是因為這個數量是我們自己控制的,然後,要在這N個平行空間,從中找出我們想要知道的答案,這就是 Simulation的威力! 每個平行空間都是隨機地安排,然後從這 N 個平行空間找到我們想要知道的答案。到底要怎樣才可以用神的視覺來作隨機的安排,首先,只考慮一個平行空間,會有 30 個學生,每位學生也有3組的語文,英文和數學的成績,那麼我就把他們的成績放在三組 Array 上,你可能會問:裡面應該裝些什麼呢?為方便計算,我會把滿分的成績用 1 來表示, 0 為沒有拿到滿分。然後,我們先專注語文的 Array ,首先,語文科滿分的只有 20 人,因此,在整條 Array 中 1 的數量應只有 20 ,而 0 則有 10 。以下就是一條任意排列: 可是要如何在程式中實現這種隨機的排列呢?其實很簡單,就是先建造一組連續數的陣列,而排列均是隨機的。在 Python 的世界,我會用 numpy 中的 random 模組去實現: 然後都把小於 19 的數學都換成 1 ,其餘都是 0 ,那就可以確保陣列裡有 20 個滿分的人。如此類推,數學和英文的 Array 也是用這個方法去作隨機的排列。好了,最後就是記錄每個平行空間有多少人能夠拿到三科滿分,也就是在三個 Array 中在同一個位置都出現三個 1 。終於回歸到面試問題的本身:至少有多少學霸拿到連中三元?筆者選擇用了 100 個平行空間,以下就是在每個平行世界的學霸數量: 在這以上一千個結果中,最少的可能值正正是 10 個人。 Mission Complete! ...