a visual walk-through · 機率 × 記憶體

擲十萬次骰子,記憶體裡發生了什麼?
NumPy probability simulation, demystified.

用「設計圖、倉庫、紙條」的比喻,看七行 Python 程式碼如何在記憶體中模擬擲骰子、計算事件 A 與 B 同時發生的聯合機率。

程式來源:114 年第二次 AI 應用規劃師-中級-第三科:機器學習技術與應用,第 41 題。

程式碼
.py
1import numpy as np2np.random.seed(123)3n = 1000004dice_rolls = np.random.randint(1, 7, size=n)5A       = (dice_rolls % 2 == 0)6B       = (dice_rolls > 3)7A_and_B = A & B
STEP 00
準備開始

歡迎!這個動畫會把七行 Python 程式碼在記憶體裡發生的事情,一步一步用「倉庫」和「紙條」的比喻畫出來。

點上方 下一步 → 開始觀看。

電腦記憶體(一座大倉庫)
VARIABLES — 牆上的紙條 HEAP — 倉庫裡的實例 Class numpy 📦 (設計藍圖) MODULE — <module 'numpy'> @ 0x7F2A·C3D4·0000 .array(...) .zeros(...) .mean(...) .sum(...) ⋯ 還有上百個工具 SUBMODULE — np.random .seed(...) .randint(...) .rand(...) ✓ seed=123 123 Class int 數值物件藍圖 OBJECT — int instance @ 0x7F2A·C3D5·0050 value = 屬性 / 方法 .bit_length() .real / .to_bytes(...) immutable int 物件 100000 100000 (1, 7) 100000 1, 7, size=100000 參數組合後送進 randint .randint() NDARRAY 實例 — dice_rolls @ 0x7F2A·C3D5·0100 3 6 2 5 1 4 6 2 ⋯ 共 100,000 格 shape: (100000,) dtype: int64 size : 100000 含義 : 模擬 10 萬次擲骰子(1~6 點) NDARRAY 實例 — A (bool, 偶數) @ 0x7F2A·C3D5·0240 F T T F F T T T ⋯ 100,000 個 T/F shape: (100000,) dtype: bool 事件 A : 骰子點數為偶數 (% 2 == 0) P(A) ≈ 0.5 NDARRAY 實例 — B (bool, > 3) @ 0x7F2A·C3D5·0380 F T F T F T T F ⋯ 100,000 個 T/F shape: (100000,) dtype: bool 事件 B : 骰子點數 > 3 (即 4, 5, 6) P(B) ≈ 0.5 NDARRAY 實例 — A_and_B (bool, A ∩ B) @ 0x7F2A·C3D5·04C0 F T F F F T T F ⋯ 100,000 個 T/F shape: (100000,) dtype: bool 事件 A ∩ B : 偶數 且 > 3,即 {4, 6} P(A ∩ B) ≈ 2/6 ≈ 0.333 np → 0x7F2A·C3D4·0000 n → 0x7F2A·C3D5·0050 dice_rolls → 0x7F2A·C3D5·0100 A → 0x7F2A·C3D5·0240 B → 0x7F2A·C3D5·0380 A_and_B → 0x7F2A·C3D5·04C0