- 症狀
- 抽題洗牌寫成
sort(() => 0.5 - Math.random())。這是常見寫法,但分佈不均勻:sort 的比較函式被假設為一致的,隨機比較違反了這個前提。 - 為什麼難
- 它不會噴錯、不會當機,只會讓某些題目長期抽不到。功能測試(回 200 嗎?有五題嗎?)永遠測不出來。
- 做法
- 改成 Fisher-Yates,用一萬次抽樣的卡方檢定釘住每個位置上每個元素的出現次數。注入固定種子的 PRNG:若直接用
Math.random,均勻分佈本身也有極小機率超過臨界值而讓 CI 隨機轉紅。並且刻意保留舊寫法當對照組,證明同一套檢定確實會把它判為不均勻。 - 結果
- 10,000 次抽樣,臨界值取自由度 4 的 18.467(p=0.001)。該檔 11 項測試全過。
- 心得
- 三句話:隨機性錯了不會噴錯,所以只有統計檢定釘得住;一個永遠會過的測試等於沒有測試,所以我留了對照組;CI 不該因為運氣而紅,所以我固定了種子。

這篇筆記的實際應用

家教出卷助手
把散落在考卷裡的題目,變成能依學生需求組卷的題庫。
看個案研究 →