ループでjavascriptを使用して、10桁の一意の乱数を少なくとも1000個生成したいと思います。これは可能ですか?それとも、Javascriptはこれを行うのに間違ったことですか?
更新:重複が作成されていないことをどのように確認しますか?
ループでjavascriptを使用して、10桁の一意の乱数を少なくとも1000個生成したいと思います。これは可能ですか?それとも、Javascriptはこれを行うのに間違ったことですか?
更新:重複が作成されていないことをどのように確認しますか?
これが私がそれをする方法です:
var arr = [],
track = [],
min = 1000000000,
max = 9999999999,
qty = 1000,
ii = 0,
rnd;
while (ii < qty) {
rnd = Math.floor(Math.random() * (max - min + 1)) + min;
if (!track[rnd]) {
arr[ii] = track[rnd] = rnd;
ii += 1;
}
}
これが実際の例です:http://jsfiddle.net/mTmEs/
さて、何かがうまくいかず、Math.random
何らかの理由で多くの重複を生成することになった場合、このコードは完了するのに長い時間がかかる可能性があります。大量の一意の乱数について話している場合でも、この種の潜在的な問題を回避する方法はないと思います。
はい、可能です。
Math.random
疑似乱数を生成するために使用します。は、以上Math.random
の疑似乱数を返すため、10桁の数値(整数を想定しています)を取得するには、それを1,000,000,000倍し、またはで四捨五入します。(すべて10桁にする必要がある場合は、それに応じて調整します—基本金額を追加する、より大きな数値を掛けるなど)。0
1
Math.round
Math.floor
それらを追跡するためにオブジェクトを使用するのでvar obj = {};
、最初に。
数字をキーとしてオブジェクトに保存します。例:obj[number] = true
。
を使用して、オブジェクトに生成された番号があるかどうかをテストしますif (obj[number])
正しい数の一意の番号が得られるまでループします。
数値を格納するためにオブジェクトを使用する理由は、JavaScriptオブジェクトはその性質上マップであり、エンジンはオブジェクトからプロパティをすばやく取得するように最適化されているためです。裏では、実装は好きなことを行うことができますが、おそらくハッシュテーブルなどを使用します。
これに「配列」を使用する必要はないことに注意してください。JavaScript配列は実際には配列ではなく、いくつかの特別な機能を備えた単なるオブジェクトです。
長さlのn個の乱数を生成するための一般的な関数は次のようになります。
// Generate n unique random numbers of length l
// l should be less than 15
function genNRandLen(n, l) {
// Make sure l and n are numbers
n = Number(n);
l = Number(l);
// Protect against bad input
if (isNaN(l) || isNaN(n)) return;
var o = {}, a = [], num;
var min = l == 1? 0 : Math.pow(10, l-1);
var r = Math.pow(10, l) - min;
// Protect against endless loop
if (n >= (r)) return;
while (n--) {
do {
num = Math.floor(min + (Math.random()*r));
} while (o[num])
o[num] = true;
a[n] = num;
}
return a.sort();
}
並べ替えは、テスト時に重複を簡単に確認できるようにするためのものです。不要な場合は削除するか、ランダムな順序を使用することをお勧めします。
15桁より長い数字が必要な場合は、短い乱数の文字列を連結し、必要な長さにトリミングすることで作成できます。以下は、任意の長さの乱数を生成します。
// Generate random number of length l
function randLen(l) {
var n = '';
while (n.length < l) {
n += String(Math.random()).replace(/^0\.0*/,'');
}
return n.substring(0, l);
}
数値に変換すると結果が混乱するため、文字列を返す必要があります。ああ、そしてすべての数字は整数です。
これはJSで行うことができますが、配列をチェックして、現在生成されている乱数が含まれているかどうかを確認する必要があります。これにより、明らかにパフォーマンスが低下します。
これらの回答が役立つかどうかを確認してください。
なぜだめですか?コードは次のとおりです。
var a=[];
for (var i=1000; i--;)
a.push(Math.random()*10000000000)