簡単な質問:のjavascript:レンジから2つのランダムなく、明確な数字を生成
のpythonのコード行を実装するための最良の方法は、
...(与えられた範囲の中から2つのランダムが、明確な数字を生成)とは何ですかrandom.sample(xrange(10), 2)
... in Javascript?
ありがとうございます!
マーティン
簡単な質問:のjavascript:レンジから2つのランダムなく、明確な数字を生成
のpythonのコード行を実装するための最良の方法は、
...(与えられた範囲の中から2つのランダムが、明確な数字を生成)とは何ですかrandom.sample(xrange(10), 2)
... in Javascript?
ありがとうございます!
マーティン
は、スプライスを使用して私の試みです:
機能に包ま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);
は、それが最初のと同じではありませんまで、第2の生成を繰り返し、その後、1を生成します。小さなチャンスで走る必要がありますが、何十億もの数字を生成する必要がなければ、パフォーマンスは低下しません。ここで
0からまでの乱数を生成する場合は1つの方法は、数字r1
をランダムに選択して0..n
とし、次にr2
を0..n-1
から選択し、r2 >= r1
の場合は、1をr2
に加算します。
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
このO(n *範囲)のパフォーマンス。私はそれを使用することをお勧めしません。レンジ配列がすでに作成されていると仮定した場合はO(n)、それ以外の場合はO(n + range)となるKnuthシャッフルのn回の繰り返しを実行する方がよいでしょう。 – Brian