2011-02-09 114 views

回答

5

这里使用我尝试拼接:

var a = [1,2,3,4,5,6,7,8,9,10];var sample = []; 
sample.push(a.splice(Math.random()*a.length,1)); 
sample.push(a.splice(Math.random()*a.length,1)); 

在功能裹:

function sample_range(range, n) { 
    var sample = []; 
    for(var i=0; i<n; i++) { 
    sample.push(range.splice(Math.random()*range.length,1)); 
    } 

    return sample; 
} 

var sample = sample_range([1,2,3,4,5,6,7,8,9,10], 2); 

我们也可以坚持功能为Array.prototype有类似点符号语法:

Array.prototype.sample_range = function(n) { 
    var sample = []; 
    for(var i=0;i<n;i++) { 
     sample.push(this.splice(Math.random()*this.length,1)); 
    } 
    return sample; 
}; 
var sample = [1,2,3,4,5,6,7,8,9,10].sample_range(2); 
+0

在此O(n *范围)上的性能。我不会建议使用它。如果你假设已经创建了范围数组,那么你最好运行n次迭代的Knuth shuffle,否则就是O(n),否则为O(n + range)。 – Brian 2013-11-01 16:00:47

0

生成一个,然后重复产生第二,直到它的不一样之首。微小的机会,它将不得不运行更长的时间,但是除非你需要产生数十亿的数字,否则你不会看到任何性能问题。

4

如果要生成0到之间的随机数210,一种方法是随机挑选中的0..n,然后从0..n-1中挑选r2,如果r2 >= r1r2则加1。

1
function sample(range,tot){ 
    if(tot > range){ 
     alert('infinite loop?'); 
     return []; 
    } 
    var myRandomNumbers = []; 
    for(var i = 0; i<tot; i++){ 
     var randN = Math.floor(Math.random()*range); 
     while(myRandomNumbers.contains(randN)){ 
      randN = Math.floor(Math.random()*range); 
     } 
     myRandomNumbers.push(randN); 
    } 
    return myRandomNumbers 
} 

var nums = sample(10,2); //array containing 2 distinct random numbers