选择 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);
如果您只需要大量值中的一小部分,这将导致大量开销
假设我在 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);
如果您只需要大量值中的一小部分,这将导致大量开销