2021年7月2日 星期五

Fisher-Yates Shuffle 亂數排序演算法

被問到亂數排序的問題,之前都只是會用 Math.random() ,用陣列方法排一排之類的,沒在認真思考最有效率的排法。
有一個很瀟灑的寫法:

     array.sort((a, b) => Math.random() - 0.5);

可惜經過實測,不知為何會有機率分配不均的問題,因此才往下看 Fisher-Yates Shuffle。
原理是將陣列由後往前每次與前方隨機一個元素交換位置,這樣實測結果會是差不多的,沒看過也不太容易想出合理的解,或變得要用小樣本去執行幾萬次做測試,平常不太容易會接觸到,紀錄一下。


 const fisherYatesShuffle = array => {
        for (let i = array.length - 1; i > 0; i--) {
          let x = Math.floor(Math.random() * [i + 1]);
          [array[i], array[x]] = [array[x], array[i]];
        }
      };



參考資料:

[筆記] 如何正確實作 JavaScript Array Random Shuffle 亂數排序演算法

沒有留言:

張貼留言