如何在Javascript中从数组中选择随机N项而不重复?

时间:2018-06-11 14:45:21

标签: javascript random

我有一个包含一些项目的数组,让我们说数字:

[23,4,67,8,29,46,7,2,98]

如何从阵列中选择N个不同的随机数(不多,不少)?

预期的行为:如果N = 3

[4,23,98] accepted
[7,67,29] accepted
[7,67,7]  not accepted

编辑:最后我发现了一个非常好的解决方案。线程已经关闭所以我在这里发布我的解决方案只是为了路过的人。 我有一个数组长的M和N数字来选择所以我做了一个包含M个数字(indicesArray)的数组应用了Fisher Yates算法来将这个方式对应的数字随机抽取到我的初始数组的索引并从中取出前M个项目。感谢@ArneHugo指出了正确的路径。

var arrayContainingNumbersToChoose=[23,4,67,8,29,46,7,2,98];
var indexesArray=[];
var N=5;
var resultArray=[];

var M=arrayContainingNumbersToChoose.length;

for (let i = 0; i < M; i++) {
   indexesArray.push(i);
} // result like [0, 1, 2, 3, 4, 5, 6, 7, 8]

indexesArray=fisherYatesShuffle(indexesArray); // result like [2, 4, 7, 6, 0, 1, 3, 8, 5]

for (let i = 0; i < N; i++) {
resultArray.push(arrayContainingNumbersToChoose[indexesArray[i]]);
}

console.log(resultArray);

function fisherYatesShuffle(a) {
      var j, x, i;
      for (i = a.length - 1; i > 0; i--) {
          j = Math.floor(Math.random() * (i + 1));
          x = a[i];
          a[i] = a[j];
          a[j] = x;
      }
      return a;
  }

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

&#13;
&#13;
var arr = [23,4,67,8,29,46,7,2,98];
var result = [];
var map = {};
var n = 3;
var i = arr.length;
var counter = arr.length+n;
while(result.length != n){
      num = arr[Math.floor(Math.random() * i)];
      if(!map[num]){
        map[num] = i;
        result.push(num);
      }
      if(counter <= 0) // stop finding random numbers if counter is zero.
        break;
      counter--;
      i--;
      if(i  == 0)
        i = arr.length;
}
console.log(result);
&#13;
&#13;
&#13;