选择 15 个随机数,将它们打乱,以免重复

Pick 15 random numbers put them shuffle them to not get duplicates

假设我在 1 到 12 之间选择 10 个随机数并将它们放入一个数组中。我怎样才能遍历它以消除重复项?

我在这上面花了很多时间,但无法让它发挥作用。

如果您想要 1 到 20 之间的 15 个随机整数且不重复,那是您范围内的大部分整数。我只会生成数字 1-20 并随机删除一个数字 15 次:

function randomIntegersInRange(min:int, max:int, count:uint):Array {
    if (min >= max || count > max - min) throw new ArgumentError("Invalid arguments!");
    var integers:Array = [];
    for (var i:int = min; i <= max; i++) {
        integers.push(i);
    }

    var randomIntegers:Array = [];
    for (i = 0; i < count; i++) {
        randomIntegers.push(integers.splice(Math.random() * integers.length, 1));
    }
    return randomIntegers;
}

randomIntegersInRange(1, 20, 15); // 16,4,3,13,8,17,1,19,20,15,6,18,14,10,12
randomIntegersInRange(1, 50, 20); // 27,3,19,9,42,23,13,29,11,24,41,31,26,2,7,30,49,33,6,10

注意:如果您想要很大的范围,比如 1 到 1,000,000 之间的 15 个整数,我不推荐这样做。

做一个递归的方法,

function pushIt(arr){
 var idx:int;
 if(arr.length == 10){ return arr; }
 else { 
   idx = Math.floor(Math.random() * 12) + 1;
   if(arr.indexOf(idx) == -1){ arr.push(idx); } 
   return pushIt(arr);
 }
}

console.log(pushIt([]));

[5、1、8、4、10、9、11、2、6、7]

function generateUniqueArray(length, rangeMax){
  var arr = [];
  while(arr.length < length) {
    var rand = Math.ceil(Math.random()*rangeMax);
    var isInArr = false;
    for(var i = 0; i<arr.length;i++){
      if(arr[i]===rand){
        isInArr = true;
        break;
      }
    }
    if (!isInArr){
      arr[arr.length]=rand;
    }
  }
  return arr;
}

console.log(generateUniqueArray(10,12));

您可以将它们放入散列(js 对象)中,然后 return 散列中的键:

function getUniques(arr){
   var seen = {};
   arr.forEach(function(item){
     seen[item] = true;
   });
   return Object.keys(seen);
}

这个问题有两种解决方法:

创建一个随机数,检查它是否已经被选中,如果没有,将这个值添加到输出。

var numbers = [];
while(numbers.length < 10){
    var nr = Math.floor(Math.random() * 12)+1
    if(numbers.indexOf(nr) === -1) numbers.push(nr);
    else console.log("threw away ", nr);
}

这很好用,如果你想 select 大范围之外的少量数字, 因为这里很可能会遇到一些碰撞(一遍又一遍地选择相同的随机数,然后不得不将其丢弃)。

在您的情况下,12 个范围内的 10 个值,您很可能会获得很多匹配项 在代码必须一遍又一遍地创建随机数以找到另一个的结尾 您的集合中没有的号码。

所以我们进入第二个方法:创建一个包含所有可能值的集合,将其洗牌, 然后从中取出一片。

//a helper to shuffle the array
function shuffle(arr){
    for(var i=arr.length; --i > 0; ){
        var j = Math.floor(Math.random() * i);
        var tmp = arr[j];
        arr[j] = arr[i];
        arr[i] = tmp;
    }
    return arr;
}

//a helper to create a sequence ov values
function range(from, to, step){
    step = Math.abs(+step) || 1;
    to = +to || 0;
    var i = +from || 0, out = [];
    if(i > to) while(i>to) out.push(i), i -= step;
    else while(i<to) out.push(i), i += step;
    return out;
}

var numbers = shuffle(range(1,13)).slice(0, 10);

如果您只需要大量值中的一小部分,这将导致大量开销