Heim  >  Fragen und Antworten  >  Hauptteil

js verwirrt das Array vollständig – Stapelüberlauf

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

Völlig gestört, erfordert es, dass die Position jedes Elements geändert werden muss

学习ing学习ing2662 Tage vor911

Antworte allen(8)Ich werde antworten

  • 仅有的幸福

    仅有的幸福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;
    }

    新建了一个数组,并且污染了原数组,很不优雅,题主可以自己改进下

    Antwort
    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) 

    Antwort
    0
  • 某草草

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

    随机是不可能保证每个位置都变动的。

    要彻底打乱,就不能保证位置都变。

    笨一点的方法就是打乱一次,再跟数组做比较,直到符合条件为止。

    Antwort
    0
  • 巴扎黑

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

    刚没看清 , 这个可以吗?
    function upset(arr){
         let newArr = arr.slice().sort(() => Math.random()>0.5 ? 1 : -1)
         let result = arr.some((item,index)=>{
             return item === newArr[index]
         })
         if(!result){
             return newArr
         }else{
             return upset(newArr)
         }
    }
    

    Antwort
    0
  • PHP中文网

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

        function compare(a , b){
            Math.random > 0.5 ? return -1 ; return 1
        } 
        arr.sort(compare);
        

    Antwort
    0
  • 習慣沉默

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

    function shuffle (arr) {

        var _floor = Math.floor,
            _random = Math.random,
            len = arr.length;
        for(var i = 0; i < len - 1; ++i){
            var rand_pos = _floor(_random() * (len - i)) + i;
            if(rand_pos != i){
                var tmp = arr[i];
                arr[i] = arr[rand_pos];
                arr[rand_pos] = tmp;
            }
        }
        return arr;
    };

    Antwort
    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))
    }

    Antwort
    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 ]

    位置全都动其实并不是最乱的;

    最乱的应该是随机洗牌,有一定概率保持某个数不动,这样才没规律可循。

    Antwort
    0
  • StornierenAntwort