2011-02-09 11 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 *範囲)のパフォーマンス。私はそれを使用することをお勧めしません。レンジ配列がすでに作成されていると仮定した場合はO(n)、それ以外の場合はO(n + range)となるKnuthシャッフルのn回の繰り返しを実行する方がよいでしょう。 – Brian

0

は、それが最初のと同じではありませんまで、第2の生成を繰り返し、その後、1を生成します。小さなチャンスで走る必要がありますが、何十億もの数字を生成する必要がなければ、パフォーマンスは低下しません。ここで

4

0からまでの乱数を生成する場合は1つの方法は、数字r1をランダムに選択して0..nとし、次にr20..n-1から選択し、r2 >= r1の場合は、1をr2に加算します。

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 
関連する問題