在開發(fā)過程中,我們經(jīng)常會用到隨機數(shù)來生成一些不同的結(jié)果,比如抽獎、洗牌等。但是如果隨機生成的數(shù)出現(xiàn)重復(fù),就會影響到程序的正常運行。今天,我們就來探討一下如何在JavaScript中生成不重復(fù)的隨機數(shù)。
首先,我們可以通過Math.random()函數(shù)來生成隨機數(shù)。它會返回一個介于0(含)到1(不含)之間的隨機數(shù),例如:
Math.random(); //0.123456789
但是這樣生成的隨機數(shù)可能會重復(fù),所以我們要想辦法避免重復(fù)。一種思路是使用循環(huán)來不斷生成新的隨機數(shù),檢查是否已經(jīng)出現(xiàn)過。例如,我們可以通過一個數(shù)組來保存已經(jīng)生成的隨機數(shù),每次循環(huán)生成一個新數(shù)后檢查數(shù)組中是否已存在:
let arr = []; //保存已經(jīng)生成的隨機數(shù) let num = 0; //生成的新隨機數(shù) while (arr.length < 10) { //生成10個隨機數(shù) num = Math.floor(Math.random() * 100); if (!arr.includes(num)) { //判斷數(shù)組中是否已存在 arr.push(num); } } console.log(arr); // [23, 91, 34, 55, 78, 12, 64, 1, 43, 87]
這樣就能夠生成10個不重復(fù)的0到99之間的隨機數(shù)。但是,使用循環(huán)生成隨機數(shù)的效率并不高,特別是在需要生成大量隨機數(shù)的情況下。因此,我們還需要尋找其他的優(yōu)化方法。
接下來,我們介紹一種新的思路,即使用Fisher-Yates Shuffle算法。該算法是一種經(jīng)典的洗牌算法,用于隨機調(diào)換一個數(shù)組的順序。我們可以把該算法稍作修改,用于生成不重復(fù)的隨機數(shù)。
function shuffle(n) { let arr = []; for (let i = 0; i < n; i++) { arr.push(i); } for (let i = n - 1; i > 0; i--) { //只需循環(huán)n - 1次 let j = Math.floor(Math.random() * (i + 1)); //生成0 ~ i之間的隨機數(shù) [arr[i], arr[j]] = [arr[j], arr[i]]; //交換兩個位置的值 } return arr; } console.log(shuffle(10)); // [7, 3, 6, 8, 0, 1, 9, 4, 2, 5]
這個函數(shù)將生成0到n-1之間的隨機數(shù),且保證每個數(shù)只出現(xiàn)一次。這是因為它通過不斷隨機交換數(shù)組中的元素,使得每個元素都有機會處于任意位置,從而生成一個隨機且不重復(fù)的序列。
以上就是兩種在JavaScript中生成不重復(fù)隨機數(shù)的方法。如果你只需要生成少量的隨機數(shù),第一種方法更為簡單易懂;如果需要生成大量隨機數(shù)或需要生成的數(shù)值范圍較大,第二種方法則更為高效。希望這篇文章對你有所幫助!