一个数组从另一个数组中随机取元素

有一个数组a=[4,19,23,44,56,1],新建一个数组b,b从a中一次随机选取一个元素,取完为止。用JavaScript实现

阅读 5.7k
7 个回答

可以用伪随机对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;
});
var a=[4,19,23,44,56,1];
var b=[];
var c=[0,0,0,0,0,0];
var aLen = a.length;
while (c.indexOf(0)!=-1){
    var randomNum = Math.floor(Math.random()*aLen);
    if (c[randomNum] == 0){
        b.push(a[randomNum]);
        c[randomNum]=1
    }
}
console.log(b);

实现如下:

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

我的思路是遍历这个数组,获取这个数组中的随机元素,从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)
   var a=[4,19,23,44,56,1];
    function randomSelect(str){
        var leng= a.length;
        var b=[];
      while(leng!=0){
          b.push(a.splice(Math.random()*leng,1).join())
          leng--;
      }
       return b;
    }
    console.log(randomSelect(a));
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script>
      //有一个数组a=[4,19,23,44,56,1],新建一个数组b,b从a中一次随机选取一个元素,取完为止。用JavaScript实现
      var a = [4,19,23,44,56,1];
      var b = [];

      function findInArr(num, arr){
        for(var i=0; i<arr.length; i++){
          if(num == arr[i]){
            return true;
          }
        }
        return false;
      }

      function rnd(m,n){
        return m + Math.floor(Math.random()*(n-m));
      }

      function randomPass(arr){
        var len = arr.length;
        var rndIndex = rnd(0,len-1);
        console.log(rndIndex);
        var temp = arr[rndIndex];
        if(!findInArr(temp,b)){
          b.push(temp);
          arr.splice(rndIndex,1);
          if(arr.length > 0){
            randomPass(arr);
          }
        }
      }

      randomPass(a);
      console.log(b); // [44, 56, 19, 23, 4, 1] (每次随机)
      console.log(a); // []

    </script>
  </body>
</html>

说下四楼不写了 就是从数组一里每次随机一个 随机出来之后从数组里剔除 继续随机 吧剔除的压入新数组里就ok了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题