【问题标题】:JavaScript: how to stop a random number from appearing twiceJavaScript:如何阻止随机数出现两次
【发布时间】:2013-03-04 08:35:54
【问题描述】:

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

这是当前代码:

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

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

【问题讨论】:

标签: javascript random


【解决方案1】:

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

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

当你想选择一个随机数时,你只需这样做:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      您始终可以使用哈希表,在使用新号码之前,请检查它是否在其中。这适用于更大的数字。现在 24 岁,您可以随时随机播放数组。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-01-09
          • 2022-01-16
          • 1970-01-01
          • 2014-05-08
          • 1970-01-01
          • 2021-03-22
          • 2016-03-08
          • 2017-08-20
          • 1970-01-01
          相关资源
          最近更新 更多