乱数発生器を使用する際に、数値が一度出現した場合にその数値が出現しないようにするにはどうすればよいでしょうか?
現在のコードは次のとおりです。
var random = Math.ceil(Math.random() * 24);
しかし、数字は複数回表示されます。
乱数発生器を使用する際に、数値が一度出現した場合にその数値が出現しないようにするにはどうすればよいでしょうか?
現在のコードは次のとおりです。
var random = Math.ceil(Math.random() * 24);
しかし、数字は複数回表示されます。
可能な値の配列を使用できます(あなたの場合は 24 になると思います):
var values = [];
for (var i = 1; i <= 24; ++i){
values.push(i);
}
乱数を選びたいときは、次のようにします。
var random = values.splice(Math.random()*values.length,1)[0];
必要な数がわかっている場合は簡単です。最初に配列を作成します。
var arr = [];
for (var i = 0; i <= 24; i++) arr.push(i);
次に、この小さな関数でシャッフルできます。
function shuffle(arr) {
return arr.map(function(val, i) {
return [Math.random(), i];
}).sort().map(function(val) {
return val[1];
});
}
そして、次のように使用します。
console.log(shuffle(arr)); //=> [2,10,15..] random array from 0 to 24
ハッシュテーブルはいつでも使用でき、新しい番号を使用する前に、そこにあるかどうかを確認してください。それはより大きな数でうまくいくでしょう。24 の場合、いつでも配列をシャッフルできます。
生成した数値を配列に入れて、それに対してチェックすることができます。値が見つかった場合は、再試行してください。
var RandomNumber = (function()
{
// Store used numbers here.
var _used = [];
return {
get: function()
{
var random = Math.ceil(Math.random() * 24);
for(var i = 0; i < _used.length; i++)
{
if(_used[i] === random)
{
// Do something here to prevent stack overflow occuring.
// For example, you could just reset the _used list when you
// hit a length of 24, or return something representing that.
return this.get();
}
}
_used.push(random);
return random;
}
}
})();
次のように、すべての一意の値を取得できることをテストできます。
for(var i = 0; i < 24; i++)
{
console.log( RandomNumber.get() );
}
現在の唯一の問題は、乱数を取得できる回数 (この場合は 24) よりも多く乱数を取得しようとすると、スタック オーバーフロー エラーが発生することです。