1

如果一个数字已经出现过一次,你怎么能在使用随机数生成器时阻止它出现?

这是当前代码:

var random = Math.ceil(Math.random() * 24);

但这些数字不止一次出现。

4

4 回答 4

3

您可以使用一组可能的值(我认为在您的情况下它将是 24):

var values = [];
for (var i = 1; i <= 24; ++i){
    values.push(i);
}

当您想选择一个随机数时,您只需执行以下操作:

var random = values.splice(Math.random()*values.length,1)[0];
于 2013-03-04T00:25:35.170 回答
2

如果你知道你想要多少个数字那么很容易,首先创建一个数组:

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
于 2013-03-04T00:24:22.080 回答
1

您始终可以使用哈希表,在使用新号码之前,请检查它是否在其中。这适用于更大的数字。现在对于 24 位,您始终可以对数组进行洗牌。

于 2013-03-04T00:22:05.153 回答
0

您可以将生成的数字放入一个数组中,然后对其进行检查。如果找到该值,请重试:

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),您将收到堆栈溢出错误。

于 2013-03-04T00:24:20.153 回答