JS打亂數組順序詳解

一、使用Math.random()打亂數組順序

一種簡單的方法是使用Math.random()函數。代碼如下:

function shuffle(arr) {
   return arr.sort(() => Math.random() - 0.5);
}

代碼中的sort()方法會根據回調函數的返回值進行排序,因此在每次排序時,都會隨機生成一個0到1的小數,如果小於0.5,則順序不變,如果大於0.5,則會交換位置,達到打亂數組順序的目的。

這種方法的缺點是無法保證完全均勻的打亂順序,可能會出現某些元素始終在數組的固定位置上。

二、使用洗牌算法打亂數組順序

洗牌算法也稱為Fisher-Yates算法,步驟如下:

1. 從最後一個元素開始,對於每一個元素,生成一個隨機數作為索引。

2. 將當前元素與隨機索引位置的元素交換。

3. 重複上述步驟,直到第一個元素。

代碼實現如下:

function shuffle(arr) {
    for (let i = arr.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
}

這種方案可以到達更完全的均勻打亂順序的效果,因為每個元素的位置都有可能在每個位置。而且該算法還具有良好的時間複雜度,只需要一個for循環即可實現。

三、使用Array.sort()與隨機數打亂數組順序

在第一種方法中,我們使用sort()方法來排序數組,從而達到打亂順序的目的。如果我們想要保留這種方法,同時又想要更好的打亂效果,可以結合隨機數。代碼如下:

function shuffle(arr) {
    return arr.sort(() => 0.5 - Math.random());
}

這樣可以保持sort()方法的應用,同時加入隨機的影響,達到更好的隨機打亂效果。同樣的,這種方法也存在一定的不足,即儘管概率較小,但是有可能產生某段順序被打亂後滿足順序排列的情況。

四、使用ES6的解構語法打亂數組順序

在ES6中,我們可以使用解構語法很方便地打亂數組順序。代碼如下:

function shuffle(arr) {
  let newArr = [...arr];
  for (let i = newArr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [newArr[i], newArr[j]] = [newArr[j], newArr[i]];
  }
  return newArr;
}

使用ES6的解構語法可以更優雅地打亂數組順序,同時也可以保持完全隨機的打亂順序。

五、使用Durstenfeld洗牌算法打亂數組順序

在Fisher-Yates算法中,要實現對數組的打亂需要從後向前掃描數組,這意味着算法使用了隨機訪問(Random Access),因此效率不高。提高效率的一個傳統方法是隨機交換算法,即Durstenfeld洗牌算法。Durstenfeld洗牌算法是一種優化、更簡單的Fisher-Yates洗牌算法。

代碼實現如下:

function shuffle(arr) {
    for (let i = arr.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
}

該算法最大的優勢就在於不需要對數組進行兩次隨機訪問和緩存外部隨機訪問。

六、使用Lodash庫的shuffle方法打亂數組順序

Lodash是一個一致性、模塊化、高性能的JavaScript實用工具庫。該庫提供了非常多的函數來幫助我們處理JavaScript中的常見問題,包括數組的隨機打亂。

使用Lodash提供的shuffle方法可以很容易地實現數組順序打亂,代碼如下:

const _ = require('lodash');
const arr = [1, 2, 3, 4, 5];
const shuffledArr = _.shuffle(arr);
console.log(shuffledArr);

使用Lodash庫可以非常便捷地實現打亂數組的目的,且Lodash的shuffle方法實現也是非常優秀的。

原創文章,作者:EDYHB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333048.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EDYHB的頭像EDYHB
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • Python去掉數組的中括號

    在Python中,被中括號包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括號。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • Python二維數組對齊輸出

    本文將從多個方面詳細闡述Python二維數組對齊輸出的方法與技巧。 一、格式化輸出 Python中提供了格式化輸出的方法,可以對輸出的字符串進行格式化處理。 names = [‘A…

    編程 2025-04-29
  • Java創建一個有10萬個元素的數組

    本文將從以下方面對Java創建一個有10萬個元素的數組進行詳細闡述: 一、基本介紹 Java是一種面向對象的編程語言,其強大的數組功能可以支持創建大規模的多維數組以及各種複雜的數據…

    編程 2025-04-28
  • Python數組隨機分組用法介紹

    Python數組隨機分組是一個在數據分析與處理中常用的技術,它可以將一個大的數據集分成若干組,以便於進行處理和分析。本文將從多個方面對Python數組隨機分組進行詳細的闡述,包括使…

    編程 2025-04-28

發表回復

登錄後才能評論