在 JavaScript 中隨機選擇陣列索引


從陣列中隨機選擇索引的過程在各種 JavaScript 應用中至關重要,因為它使開發者能夠在其程式碼中引入不可預測性和多樣性。透過加入隨機選擇索引的能力,開發者可以增強其應用程式的動態性和多功能性,從而帶來更具吸引力的使用者體驗。在本文中,我們將探討在 JavaScript 中從陣列中隨機選擇索引的細微之處,揭示潛在的技術和鮮為人知的方法,這些方法使開發者能夠在其基於陣列的操作中引入隨機性。透過對這些概念的全面理解,開發者將掌握必要的知識,使他們的程式碼具有偶然性,並將他們的應用程式轉變為引人入勝且不可預測的體驗。

問題陳述

問題在於需要一種高效的 JavaScript 演算法,能夠從陣列中隨機提取索引,並且每個索引具有相等的機率。由於缺乏內建方法來實現此目的,因此產生了這一挑戰。本文的主要目標是透過提出一種始終以最佳方式達到預期結果的演算法來提供全面的解決方案。

示例輸入:

考慮一個數組,例如 arr = [12, 45, 7, 89, 34, 56],任務是從該陣列中隨機選擇一個索引。

示例輸出:

期望輸出是一個單一的索引值,從給定陣列中隨機選擇,例如 3,它表示陣列中數字 89 的索引。

方法

在本文中,我們將看到在 JavaScript 中解決上述問題陳述的幾種不同方法:

  • 使用 Math.random() 和 Math.floor()

  • 使用 Fisher-Yates (Knuth) 洗牌演算法

  • 使用水塘抽樣演算法

方法 1:使用 Math.random() 和 Math.floor()

要在 JavaScript 中隨機選擇陣列中的索引,請使用 Math.random() 和 Math.floor() 函式。首先定義元素陣列。使用 Math.random() 生成一個介於 0 到 1 之間的任意浮點數。將此隨機數乘以陣列的大小,以獲得介於 0 和陣列長度(不包括長度本身)之間的值。為了將小數轉換為整數索引,請使用 Math.floor()。最後,使用獲得的索引從陣列中檢索相應的元素,以便進行後續操作或處理。

示例

程式碼定義了一個名為 getRandomIndex 的函式,該函式在陣列中生成一個隨機索引。它使用 Math.random() 和 Math.floor() 獲取 0 到陣列長度之間的隨機數。該函式返回此隨機索引。定義函式後,程式碼建立一個數組,並使用陣列作為引數呼叫 getRandomIndex,並將結果賦值給 randomIndex。然後,它訪問 randomIndex 處的元素並將其賦值給 randomElement。最後,它使用 console.log() 和模板字面量將隨機索引和元素記錄到控制檯。

function getRandomIndex(array) {
   let randomIndex = Math.floor(Math.random() * array.length);
   return randomIndex;
}
const array=[12, 52, 232, 112, 999, 34, 77, 94, 88];
const randomIndex=getRandomIndex(array);
const randomElement=array[randomIndex];
console.log(`Random Index: ${randomIndex}`);
console.log(`Random Element: ${randomElement}`);

輸出

以下是控制檯輸出:

Random Index: 0
Random Element: 12

方法 2:使用 Fisher-Yates (Knuth) 洗牌演算法

要在 JavaScript 中使用 Fisher-Yates 洗牌演算法從陣列中隨機選擇索引,首先定義陣列。然後,用陣列長度減一初始化一個變數。進入一個迴圈,直到當前索引變為零。在每次迭代中,生成 0 到當前索引之間的隨機索引。將當前索引處的元素與隨機索引處的元素交換。遞減當前索引並繼續迴圈,直到到達第一個索引。迴圈結束後,陣列已被打亂。要從打亂的陣列中選擇隨機索引,請在 0 到陣列長度之間生成隨機索引。

示例

提供的程式碼包括一個名為“getRandomIndex”的函式,該函式在指定範圍內生成隨機索引。它使用“Array.from”建立陣列,併為每個元素分配其對應的索引。該函式使用 while 迴圈透過交換元素來洗牌陣列。打亂的陣列的第一個元素作為隨機索引返回。在函式之外,定義一個數組,並呼叫“getRandomIndex”函式以獲得隨機索引和相應的元素。然後,程式碼使用模板字面量將隨機索引和元素列印到控制檯,以便於閱讀輸出。

function getRandomIndex(n) {
   const array = Array.from({ length: n }, (_, index) => index);
   var currentIndex = array.length;
   var temporaryValue, randomIndex;

   // While there remain elements to shuffle
   while (currentIndex !== 0) {
   
      // Pick a remaining element
      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;

      // Swap with the current element
      temporaryValue = array[currentIndex];
      array[currentIndex] = array[randomIndex];
      array[randomIndex] = temporaryValue;
   }

   // Return the first index
   return array[0];
}
const array=[12, 52, 232, 112, 999, 34, 77, 94, 88];
const randomIndex=getRandomIndex(array.length);
const randomElement=array[randomIndex];
console.log(`Random Index: ${randomIndex}`);
console.log(`Random Element: ${randomElement}`);

輸出

以下是控制檯輸出:

Random Index: 5
Random Element: 34

方法 3:使用水塘抽樣演算法

要在 JavaScript 中使用水塘抽樣演算法從陣列中隨機選擇索引,請建立一個名為 getRandomIndex 的函式。初始化 currentIndex 和 randomIndex 變數。遍歷陣列,從索引 1 開始,並在 0 到 currentIndex 之間生成一個隨機數。如果隨機數小於 1 / (currentIndex + 1),則將 randomIndex 更新為當前索引。在每次迭代中遞增 currentIndex。迴圈結束後,返回 randomIndex 作為所選索引。即使對於大型陣列,此演算法也能確保所選索引的均勻分佈,並且記憶體使用量恆定。

示例

程式碼包括一個名為“getRandomIndex”的函式,該函式在給定範圍內生成隨機索引。它是透過建立一個指定長度的陣列來實現的,並將每個元素對映到其相應的索引。然後,該函式初始化變數以跟蹤當前索引和隨機索引。在迴圈中,在 0 到當前索引之間生成一個隨機索引,並使用臨時變數交換元素來洗牌。迭代所有元素後,該函式返回最後選擇的索引。在其餘程式碼中,使用陣列長度呼叫“getRandomIndex”函式,並將結果儲存在“randomIndex”中。檢索並列印隨機選擇的索引處的值到控制檯。

function getRandomIndex(n) {
   const array = Array.from({ length: n }, (_, index) => index);
   let currentIndex = 0;
   let randomIndex;

   for (let i = 0; i < array.length; i++) {
      // Generate a random index between 0 and currentIndex (inclusive)
      randomIndex = Math.floor(Math.random() * (currentIndex + 1));

      // Swap elements at randomIndex and currentIndex
      let temp = array[currentIndex];
      array[currentIndex] = array[randomIndex];
      array[randomIndex] = temp;

      currentIndex++;
   }

   // Return the last selected index
   return array[currentIndex - 1];
}
const array=[12, 52, 232, 112, 999, 34, 77, 94, 88];
const randomIndex=getRandomIndex(array.length);
const randomElement=array[randomIndex];
console.log(`Random Index: ${randomIndex}`);
console.log(`Random Element: ${randomElement}`);

輸出

以下是控制檯輸出:

Random Index: 3
Random Element: 112

結論

總之,在 JavaScript 中從陣列中隨機選擇索引的任務可以透過細緻的實現有效地完成。使用合適的演算法方法,例如使用 Fisher-Yates 洗牌或使用加密函式生成隨機索引,可以促進選擇過程中的偶然性和不可預測性。透過採用這些方法,開發者可以在他們的程式碼中融入一絲奇思妙想和趣味性,從而提升整體的使用者體驗。因此,透過利用這些鮮為人知的方法,JavaScript 程式設計師可以自信地賦予他們的陣列以偶然性的魅力,營造出令人愉悅的意外和新穎的環境。

更新於:2023年8月4日

瀏覽量:359

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告