如果一个数字已经出现过一次,你怎么能在使用随机数生成器时阻止它出现?
这是当前代码:
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),您将收到堆栈溢出错误。