搜尋

首頁  >  問答  >  主體

javascript - 一個陣列從另一個陣列中隨機取元素

有一個陣列a=[4,19,23,44,56,1],新建一個陣列b,b從a中一次隨機選取一個元素,取完為止。用JavaScript實作

PHP中文网PHP中文网2751 天前713

全部回覆(7)我來回復

  • 高洛峰

    高洛峰2017-05-19 10:33:39

    可以用偽隨機對a洗牌,取任意兩個位置的數字進行交換,如此進行n次達到洗牌效果,然後賦值給b。

    或直接按照步驟來,如果不考慮程式碼效率的話,lodash函式庫提供的陣列操作可以讓程式碼更優雅:

    var src = [4,19,23,44,56,1];
    
    var shuffle = [];
    while(src.length > 0){
        var random_index = Math.floor(Math.random() * src.length);
        shuffle.push(src[random_index]);
        
        src = src.filter(function(el, i){
            return i != random_index;
        });
    }

    想到更好的隨機方法,直接隨機排序,程式碼更簡潔,運作效率高:

    var src = [4,19,23,44,56,1];
    
    var shuffle = src;
    shuffle.sort(function(){
        return Math.floor(Math.random() * 3) - 1;
    });

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:33:39

    雷雷

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:33:39

    實作如下:

    var a = [4,19,23,44,56,1];
    function randomSort(array){
        var newArray = [];
        for(let i = 0; i < array.length;){
            let j = Math.random() * array.length; // 获取随机的下标值
            j = ~~j; // 取整
            let item = array.splice(j, 1)[0]; // 从原数组中剔除选中的元素
            newArray.push(item);
      }
      return newArray;
    }
    randomSort(a);

    回覆
    0
  • 漂亮男人

    漂亮男人2017-05-19 10:33:39

    我的想法是遍歷這個數組,取得這個數組中的隨機元素,從a數組中刪除同時push進b數組,然後類推下去

    var a = [4,19,23,44,56,1],
        aLen = a.length,
        b = [];
        
    // 定义删除数组中指定元素的方法
    Array.prototype.removeByValue = function(val) {
      for(var i=0; i<this.length; i++) {
        if(this[i] == val) {
          this.splice(i, 1);
          break;
        }
      }
    }
    
    // 遍历a数组
    for(var i=0; i<aLen; i++){
        var cur = a[Math.floor(Math.random()*a.length)]; //获取随机的元素
        a.removeByValue(cur);    // 从a中删除
        b.push(cur);            // 添加进b
    }
    
    console.log(b)

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:33:39

    雷雷

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:33:39

    雷雷

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:33:39

    說下四樓不寫了 就是從數組一裡每次隨機一個 隨機出來之後從數組裡剔除 繼續隨機 吧剔除的壓入新數組裡就ok了

    回覆
    0
  • 取消回覆