JavaScript:如何阻止随机数出现两次

时间:2013-03-04 00:17:37

标签: javascript random

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

以下是当前代码:

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

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

4 个答案:

答案 0 :(得分:3)

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

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

如果你想选择一个随机数,你可以这样做:

var random = values.splice(Math.random()*values.length,1)[0];

答案 1 :(得分: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

答案 2 :(得分:1)

您始终可以使用哈希表,在使用新号码之前,请检查它是否在那里。这对更大的数字有效。现在24岁,你总是可以随机播放阵列。

答案 3 :(得分: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),则会出现堆栈溢出错误。