搜尋

首頁  >  問答  >  主體

javascript - js完全打亂數組

var arr = [0,1,2,3,4,5,6,7]

完全打亂,要求,每個元素的位置必須改變

学习ing学习ing2773 天前980

全部回覆(8)我來回復

  • 仅有的幸福

    仅有的幸福2017-07-05 10:45:39

    首先,題主並不是要傳統的數組亂序,如果是傳統的數組亂序,當然首推Fisher-Yates,Math.random() 的黑科技並不能保證概率的一致,詳情可以看我以前的分析https://github.com/hanzichi/u...

    如果每個位置都需要變動,隨便寫了一段程式碼,勉強可以用:

    function shuffle(a) {
      let len = a.length;
      let shuffled = Array(len);
    
      for (let i = len; i--; ) {
        let rand = ~~(Math.random() * i);
        shuffled[i] = a[rand];
        a[rand] = a[i];
      }
    
      return shuffled;
    }

    新建了一個數組,並且污染了原始數組,很不優雅,主題可以自己改進下

    回覆
    0
  • PHP中文网

    PHP中文网2017-07-05 10:45:39

    把最後一個放第一個就實現了每個元素都動了,可是完全打亂是什麼意思?

    var arr = [0,1,2,3,4,5,6,7], last = arr[arr.length - 1];
    arr.splice(arr.length - 1, 1);
    arr.unshift(last) 

    回覆
    0
  • 某草草

    某草草2017-07-05 10:45:39

    隨機是不可能保證每個位置都會變動的。

    要徹底打亂,就不能保證位置都變。

    笨一點的方法就是打亂一次,再跟陣列做比較,直到符合條件為止。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-07-05 10:45:39

    雷雷

    回覆
    0
  • PHP中文网

    PHP中文网2017-07-05 10:45:39

    雷雷

    回覆
    0
  • 習慣沉默

    習慣沉默2017-07-05 10:45:39

    函數隨機播放 (arr) {

    雷雷

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-07-05 10:45:39

    隨機平移,凱撒加密紅火火…

    function shuffle (arr) {
      if (!Array.isArray(arr)) { return [] }
    
      var len = Math.floor(Math.random() * (arr.length - 1)) + 1
      return arr.slice(len).concat(arr.slice(0, len))
    }

    回覆
    0
  • 阿神

    阿神2017-07-05 10:45:39

    最簡單的位置全都動

    > arr = [0,1,2,3,4,5,6,7]
    > arr.unshift(arr.pop())
    > arr
    [ 7, 0, 1, 2, 3, 4, 5, 6 ]
    > arr.sort((a , b)=>Math.random() > 0.5 ? -1:1)
    [ 6, 5, 4, 0, 1, 3, 7, 2 ]
    > arr.sort((a , b)=>Math.random() > 0.5 ? -1:1)
    [ 6, 0, 5, 3, 4, 7, 1, 2 ]

    位置全都動其實不是最亂的;

    最亂的應該是隨機洗牌,有一定機率保持某個數不動,這樣才沒規律可循。

    回覆
    0
  • 取消回覆