有一個很瀟灑的寫法:
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]];
}
};
參考資料:
沒有留言:
張貼留言