2016-03-06 73 views
-3

说我从1到12之间挑选10个随机数字并将它们放入数组中。我如何循环以消除重复?挑选15个随机数字让他们洗牌不会得到重复

我花了很多时间在这个上,不能得到它的工作。

+0

的范围是Java或JavaScript?两者完全不同 –

+1

@Xoce您怎么看?它在for循环中有'var i = 0'。 –

+0

请问这是为什么java标记的比??? [此](http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array)帮助 –

回答

0

有两个aproaches这个问题:

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

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

这工作不错,如果您想选择号码少量出一个大范围, ,因为这里很可能打几碰撞(一遍又一遍挑选相同的随机数了一遍,必须扔掉它)。

在你的情况下10个值了一系列12的,这是很可能的,你将有其中的代码必须一遍又一遍地创建随机数结束时很多次 的一遍又一遍,以找到另一个 号这还不是你的设置。

所以我们得到第二个问题:创建一个包含所有可能值的集合,将其拖动, 然后从中分出一部分。

//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

如果你想要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点的整数。

+0

但是,如果我想要随机数字?比如说从1-50开始,然后选择20而没有得到任何重复? – zzz

+0

这给你随机数字。如果你想参数化范围,只需将上面的'20'和'15'变成变量。 – Aaron

+0

@CollapsedSounds将我的答案编辑为一个带有参数范围和数量的函数。 – Aaron

0

做一个递归方法,

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([])); 
0

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

+0

'generateUniqueArray(12,10)'* crash *;) – Aaron

0

你可以把它们放到哈希(js对象)中,然后返回哈希中的键:

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