首頁  >  文章  >  web前端  >  如何在 JavaScript 中產生不重複的隨機數字而不使用遞歸?

如何在 JavaScript 中產生不重複的隨機數字而不使用遞歸?

Patricia Arquette
Patricia Arquette原創
2024-10-20 08:02:29534瀏覽

How to Generate Non-Repeating Random Numbers in JavaScript without Recursion?

在 JavaScript 中產生非重複隨機數

在 JavaScript 中產生非重複隨機數序列可能是一個挑戰。以下是一個代表性問題及其解決方案的細分。

問題:

提供的程式碼嘗試透過檢查先前的陣列來產生不重複的隨機數產生的數字。然而,這種方法會因遞歸函數呼叫而觸發堆疊溢位錯誤。

最佳解:

不要連續遞歸函數調用,而是考慮產生一個打亂數組一開始的數字。這種方法確保每個數字僅產生一次。這是一種高效實現此目的的 Fisher–Yates Shuffle:

<code class="javascript">function shuffle(array) {
  let i = array.length;
  let j = 0;
  let temp;

  while (i--) {
    j = Math.floor(Math.random() * (i + 1));
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }

  return array;
}

let ranNums = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);</code>

該技術透過直接在原始數組中交換元素來避免昂貴的數組操作。

另一個替代方案:

對於支援產生器的瀏覽器,您可以使用下列產生器函數:

<code class="javascript">function* shuffle(array) {
  let i = array.length;

  while (i--) {
    yield array.splice(Math.floor(Math.random() * (i + 1)), 1)[0];
  }
}

let ranNums = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

ranNums.next().value; // first random number from array
ranNums.next().value; // second random number from array
// etc.</code>

透過利用產生值,此方法會延遲數組操作,直到實際需要它們為止,使其更有效率某些用例。無論您選擇哪種方法,這些解決方案都能有效地在 JavaScript 中產生不重複的隨機數。

以上是如何在 JavaScript 中產生不重複的隨機數字而不使用遞歸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn