【问题标题】:javascript/jquery random number between -13 and 13 excluding numbers between -3 and 3javascript/jquery 介于 -13 和 13 之间的随机数,不包括 -3 和 3 之间的数字
【发布时间】:2012-03-07 20:46:51
【问题描述】:

我正在使用

var min = -13;
var max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;

但它返回 -13 到 13 之间的所有数字(随机数)。我怎样才能让它生成一个介于 -13 到 -4 之间的随机数,不包括 -3、-2、-1、0、1、2、3包括4到13。

【问题讨论】:

  • 我认为这是不可能的。我会用你想要的值创建一个数组并随机访问数组
  • @EvilP,这会将恒定时间和空间操作转换为线性时间和空间操作。这就像一个数字加 1 一百次加 100。它有效,但至少可以说是不可取的。
  • @davin 数组访问线性时间操作如何
  • @Esailija,我没有说它是,虽然创建数组是线性时间。事实上,从技术上讲,它是指数空间和时间,因为输入的值是对数。
  • @davin 操作本身不涉及创建数组,数组是预先创建的,

标签: javascript jquery random


【解决方案1】:

取一个1-10之间的随机数,加3,得到4-13之间的一个:

random = Math.ceil(Math.random() * 10) + 3;

在 0-1 之间生成一个随机数。如果为0,则取负数:

random = (Math.floor(Math.random() * 2) == 0) ? 0 - random : random;

JSFiddle 显示工作副本:

http://jsfiddle.net/adamh/cyGwf/

【讨论】:

  • 标志可以通过random = (Math.random() < 0.5)? -random : random;轻松生成,无需调用math.floor
  • 风险非常小,但知道 Math.random() 提供值from 0 (including!) to 1 (excluding!),第一行可以提供值 3。因此,使用 Math.floor 和从那里工作:random = Math.floor(Math.random() * 10) + 4;
【解决方案2】:
var pickOne = [4,5,6,7,8,9,10,11,12,13],
    value   = pickOne[Math.floor(Math.random() * pickOne.length)];

value   = (Math.random() < 0.5)? value : -value;
console.log(value)

【讨论】:

    【解决方案3】:

    对你应该做的事情进行细微的调整。产生一个 -6 到 13 范围内的随机数,然后如果值小于 4,则减去 7。我没有测试过,但我怀疑它会比产生两个随机数并相乘更好。

    var min = -6; 
    var max = 13; 
    var random = Math.floor(Math.random() * (max - min + 1)) + min; 
    if(random < 4){random = random - 7;}
    

    【讨论】:

      【解决方案4】:

      据我所知,不可能生成随机数并考虑排除集。您需要创建一个递归函数来为您进行过滤。见下文:

      function GenerateRandomNumber() {
          var min = -13, max = 13;
          var random = Math.floor(Math.random() * (max - min + 1)) + min;   
      
          // If random number is undesirable, generate a new number, else return
          return (random < 4 && random > -4) ? GenerateRandomNumber() : random;
      }
      
      var myRandomNumber = GenerateRandomNumber();
      ​
      

      这里是a working fiddle

      或者,由 @Rozwel 提供,使用 while 循环的非递归版本:

      function GenerateRandomNumber() {
          var min = -13, max = 13;
          var random = 0;
      
          while (random < 4 && random > -4) {
              random = Math.floor(Math.random() * (max - min + 1)) + min;
          }
      
          return random;
      }
      

      这里是a jsperf,它将接受的答案与这两个选项进行比较。

      【讨论】:

      • 理论上可以进入无限循环
      • @FabrizioCalderan,你是认真的吗? -1 表示理论上(尽管在数学上不可能)的可能性?
      • @JamesHill,代码会以零概率进入循环,并且有一个线性的预期运行时间,所以理论上这段代码还不错。您是否对自己的帖子投了反对票?
      • @JamesHill -1 因为没有什么可以阻止函数在输出有效值之前多次生成 -2、1、2、-3...。在大学里,我看到有些人因为这种逻辑而被拒绝。实际上,您不会有无限循环,但由于上述原因,这仍然是低效的
      • 不确定它会如何影响结果,但是这些测试用例非常没用;有时你在函数中有代码,有时没有,有时你使用硬编码的幻数,有时你使用变量。所有这些差异都会改变查找时间等。因此,数据并不是很有用。
      【解决方案5】:
      var sign = Math.round(Math.random()) == 0 ? -1 : 1;
      var number = Math.round(Math.random() * 9) + 4;
      return sign * number;
      

      【讨论】:

        【解决方案6】:

        Math.round(Math.random()) 返回 0 或 1,

        所以它可以写成没有中间值:

        alert( (Math.ceil(Math.random() * 10) + 3)*(Math.round(Math.random())?1:-1));
        

        【讨论】:

          【解决方案7】:
          var n = Math.floor(Math.random() * 20) - 10;
          n = n < 0 ? n - 3 : n + 4;
          

          【讨论】:

            猜你喜欢
            • 2011-08-24
            • 2019-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-28
            • 2014-04-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多