一枚硬幣連續擲出五次正面,同一條路線的列車在同一 天發生了兩宗意外,或是隨機播放清單連續給你三首由相同 歌手演唱的歌曲。這似乎並不是巧合,但真正的隨機也許未 如我們想像中的那樣。 統計上獨立的事件:硬幣並沒有記性! 讓我們先從硬幣說起。擲一枚公平的硬幣(fair coin)時, 很多人會預期正面和反面朝上的結果會交替出現,連續擲出 正面大概會使我們目瞪口呆。在沒有細想之下,你可能也會 估計正面和反面出現的次數會各佔一半,所以如果正面出現 的比例多於一半時,反面應該就將會出現得更頻密來補償 之前不均的結果 — 當然,這個想法是錯誤的,因為硬幣並 不會記得先前的結果!如果你有一枚公平的硬幣,它連續擲 出了 99 次正面朝上的結果,你不能說下次會有較大機會擲 出反面,因為它畢竟是一枚公平的硬幣 [1]。由於每次拋擲 對下次結果都沒有影響,我們稱這些為統計上獨立的事件。 如果我們擲兩次硬幣,每次正面或反面朝上的機會均 等,以下是四個可能的結果:正正、正反、反正和反反。每個 結果發生的機會都相同(1/4),但以任何次序出現一正一 反的機率為 2/4 而不是 1/4。擲三次的話會有八種可能:正 正正、正正反、正反正、正反反、反正正、反反正、反正反和 反反反,每種可能的機率均為 1/8。一連擲十次的話,正反 正反正反正反正反、正正反正反反反反正反和反反反反反 反反反反反三者的機率都一樣,均為 1/210 或 1/1024,可 是會令你留下深刻印象的肯定是最後一個組合而不是其他 [2]。我們太著迷於從隨機產生的結果中找規律,並會就此輕 率地下結論 [3]。 現實上的洗牌演算法:Fisher–Yates 洗牌法與天真法 讓我們先介紹 Fisher–Yates 洗牌法 [2],它根據另一組 隨機數字把序列隨機地打亂。假設現在有一組由數字 1 至 10 組成的序列。首先從 1 至 10 選一個隨機號碼叫n,然後 移除上述序列中第n個數字放到一組新序列裡。之後對序 列中餘下的數字重覆以上步驟,從 1 至 9、1 至 8 中選n,如 此類推,直至序列中的所有數字都被移除(見圖一)。 如果n的選擇是隨機的,那新序列也會是完全隨機的。 讓我們來看看為甚麼這個關係會成立。我們可以以一副卡牌 作比喻來理解這個演算法:每次隨機移除一張卡牌,並把移 除的卡牌疊起來組成一副新的卡組。 把這個演算法與其他洗牌方法作比較可以突顯為甚麼 Fisher–Yates 法是真正隨機。有一個「天真(naïve)」的方 法是每次在卡組中取出一張卡牌,然後與另一張隨機選擇的 卡牌交換位置,再對卡組中的每張卡重覆以上步驟 [4]。換 言之,如果我們用天真法洗一副有三張卡的卡組(卡牌上標 記了#1、#2 和 #3),第一步我們會把卡組中的第一張卡與 第一(不變)、第二或第三張卡的其中一張交換位置。然後 到第二張卡,我們又使它與三張卡的其中一張對換位置;重 覆以上過程直至卡組中的每一張卡都洗過一遍。 每一步我們都隨機從三張卡裡面選擇一張,因此三回合 一共可以帶來3 x 3 x 3 = 33 = 27 個排列(permutations) 結果。思路清晰的你大概已經意識到我們只有 3 x 2 x 1 = 6 種方式來排列三張卡牌:123, 132, 213, 231, 312 和 321。 如果你把從天真法每一步產生的可能排列逐一列出,你會 發現 132, 213 和 231 出現了五次,而 123, 312 和 321 只 出現四次,結果顯然是偏倚的。憑直覺也能得知因為 27 並 不能被 6 整除(基本上nn 或n > 2 都不能被n! 整除),所 以某些排列一定會比其他出現得更多(如果每個排列出現 的機會均等,排列結果的數目應是 6 的倍數)。由於機會不 均等,因此天真法並不隨機。 這與我們平時洗撲克牌的方式相似:簡單來說就是將卡 組中的一疊卡牌與另一疊互換位置;可是這些方法都不會產 生隨機的結果,因為洗過的卡牌都繼續在系統裡流轉。 跟 Fisher–Yates 法對比一下,由於每個回合都有一張 卡被移除(並調到新的卡組中),所以被考慮的卡牌會越來 越少,而在我們一副三張卡的例子裡,三回合只會帶來 3 x 2 x 1 = 6 個排列結果。計算這種排列結果數目的方法與計 算三張卡牌有多少個排列可能性的方法一樣:兩者都用到階 乘函數n! = n x (n – 1) … x 3 x 2 x 1;在我們的例子中是 3! = 3 x 2 x 1,亦等同3P3。兩者背後的計算思路基本上相同, 相同之處在於列出所有可能排列的方式。因此,n本身的隨 機性在洗牌中被得以保留;這也是為甚麼只要能確保n是 隨機選出的,就能保證 Fisher–Yates 法能提供一個完全隨 機的序列。 創造不太隨機但感覺隨機的播放清單 現在回到我們在圖一的隨機序列:3-9-6-2-5-10-41-8-7。它是我們共有十首歌的隨機播放清單:曲目一、 四、七、十是 Adele(藝人甲)的歌,曲目二、五、八是 BTS 防彈少年團(藝人乙)的歌,而曲目三、六、九是 Celine Dion(藝人丙)的歌。播放清單看來是這樣的: Celine Dion > Celine Dion > Celine Dion > BTS 防彈少 年團 > BTS 防彈少年團 > Adele > Adele > Adele > BTS 防彈少年團 > Adele 這樣的播放清單看起來一點兒也不隨機!這是因為我 們不經意地聚焦在連續三首 Celine Dion 和 Adele 的 歌這個不尋常的規律裡。假如你是 2012 至 2014 年的 Spotify 用家,你也許已經急不及待去投訴 [5] 這個不給你 聽 K-pop 的該死隨機播放清單(假設你在 2014 年前已經 在聽 K-pop)。那年 Spotify 實在收到太多投訴,使他們放 棄原來使用的Fisher–Yates演算法而引入新的演算法(對! 他們原本是用 Fisher–Yates 法來產生隨機播放清單 [6])。 現在選擇隨機播放時,演算法會確保由同一歌手演唱或屬 於同一種類的歌曲大致平均地分佈在播放清單中 [7]。 正是 Spotify 工程師把播放清單弄得不再隨機,來令你 相信它變得更加隨機。
RkJQdWJsaXNoZXIy NDk5Njg=