JavaScript-shuffle(洗牌的方法)

慢慢累積經驗。

題目

假設我有一份這樣的資料:

1
const data = [1, 2, 3, 4, 5, 6, 7, ...]

如果我想打亂順序的話有什麼做法?

方法一

可以利用 Math.random - 0.5 搭配 sort 來隨機的交換位置:

1
const shuffled = data.sort(() => Math.random() - 0.5)

這應該是最簡潔的做法,原理是利用 Math.random 只會產生 0 ~ 0.99999 的特性。在這個範圍中 -0.5,就有一半的機會得到「正數 / 負數」。

接著再搭配 sort 的 compare function,在這裡面只要回傳正數就會交換位置,負數的話就不換位置,所以透過前面產生的 N 個正數和 M 個負數就會組合出不同的位置。

方法二

這是我自己想到的方法,感覺效能上可能不太好,但也不失為一種作法。

簡單來說就是給一個長度,裡面會不按照順序來放數字,例如:長度為 4,結果產出 [0, 3, 1, 2] 這樣的東西。

這些數字是要拿來當作 index 用的,不如直接看 code 吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function createRandomNumArray(total) {
const res = new Array(0)
while (res.length < total) {
// 產生 0 ~ total 間的數字(包含 0 & total)
const num = Math.floor(Math.random() * total)
// 排除掉重複的數字
if (res.some((n) => n === num)) {
continue
} else {
res.push(num)
}
}
return res
}

接著只要利用它來產生新的陣列就行了:

1
2
const data = [1, 2, 3, 4]
const shuffledData = createRandomNumArray(data.length).map((i) => data[i])

總之這也是一種方法,但不建議用在資料量很大的時候,因為要一直排除掉重複的數字可能會浪費很多計算。

React-react router dom(V5) 使用 custom hook 時要注意的事情
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×