私が取り組んでいるプロジェクトでは、範囲全体が「枯渇」するまで繰り返すことなく、指定された範囲で乱数を返す Javascript 関数が必要でした。周りにそんなものはなかったので、なんとか自作しました。
この関数には、id
を渡す必要もあります。このように、複数の乱数が必要で、それぞれに独自の履歴がある場合、id
はそれらすべてを追跡します。
関数は機能しますが、アドバイスが必要です。
- これは私が達成したいことを達成するための「適切な」方法ですか?
inArray()
非常に大きな範囲 ( ) の値を使用した場合の実行速度はmaxNum
? まだ「有効な」(つまり、履歴配列にない) 数値が生成されるまで数値をランダム化するため、数値が大きいと関数の速度が低下するように感じます。しかし、私はこれを行う別の方法を理解できません..
スクリプト:
var UniqueRandom = {
NumHistory: [],
generate: function (maxNum, id) {
if (!this.NumHistory[id]) this.NumHistory[id] = [];
if (maxNum >= 1) {
var current = Math.round(Math.random() * (maxNum - 1)), x = 0;
if (maxNum > 1 && this.NumHistory[id].length > 0) {
if (this.NumHistory[id].length !== maxNum) {
while ($.inArray(current, this.NumHistory[id]) !== -1) {
current = Math.round(Math.random() * (maxNum - 1));
x = x + 1;
}
this.NumHistory[id].push(current);
} else {
//reset
this.NumHistory[id] = [current];
}
} else {
//first time only
this.NumHistory[id].push(current);
}
return current;
} else {
return maxNum;
}
},
clear: function (id) {
this.NumHistory[id] = [];
}
};
使用法は次のようになります: (100 は範囲 (0-100) であり、the_id は .. まあ、id です)
UniqueRandom.NumHistory[100, 'the_id']
デモでFiddleをセットアップしました。