【问题标题】:Generating a Random Number with Precision in JavaScript在 JavaScript 中精确生成随机数
【发布时间】:2014-06-08 14:36:03
【问题描述】:

我有这个功能:

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

    return random;
}

现在精度没有实现,有人对我如何实现它有什么好的想法吗?精度选项的目的是为您提供固定的多个小数位,例如:

// A number from 0 to 10 that will always come back with two decimal places
Number.random(0, 10, 2); // 3.14

【问题讨论】:

  • 使用您生成的范围,如果要表示结果,则结果必须是string。或者,如果要将返回值表示为数字,则需要更改范围。
  • 范围是否太大?不用切换到字符串,我能走的最大是多少?
  • 我相信是17位有效数字。将不得不仔细检查。所以我想这取决于你想要什么作为 precision 的值

标签: javascript math random


【解决方案1】:

试试这个:

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.random() * (maximum - minimum) + minimum;

    return random.toFixed(precision);
}

它使用.toFixed()函数来设置精度

演示:http://jsfiddle.net/2rFW8/1/

【讨论】:

  • 我想这可以工作:return Number(random.toFixed(precision));
  • return parseFloat(random.toFixed(precision)); 谢谢@reaxis
  • 如果你尝试类似console.log(Number.random(undefined, undefined, 3)); 而不是console.log(Number.random(3, 5, 3));?
【解决方案2】:

您可以尝试将数字乘以10^precision,将其四舍五入,然后再除以10^precision。这会给你你想要的结果。下面是这个逻辑的粗略实现。不过,您可能希望在精度参数上添加一些错误检查,或者使用其他方式进行计算(例如 Math.pow)。

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

    for (var i = 0; i < precision; i++) {
        random = random * 10;
    }
    random = Math.round(random);
    for (var i = 0; i < precision; i++) {
        random = random / 10;
    }

    return random;
}

【讨论】:

    【解决方案3】:

    试试这个:

    Number.random = function(minimum, maximum, precision) {
        minimum = minimum === undefined ? 0 : minimum;
        maximum = maximum === undefined ? 9007199254740992 : maximum;
        precision = precision === undefined ? 0 : precision;
    
        var random = Math.random() * (maximum - minimum + 1) + minimum;
    
        return Math.round(random * Math.pow(10, precision)) / Math.pow(10, precision);
    }
    

    【讨论】:

      【解决方案4】:
           Number.random = function(minimum, maximum, precision) {
           minimum = minimum||0;
           maximum = maximum ||9007199254740992;
          precision =precision ||0;
      
          var random = Math.random() * (maximum - minimum + 1) + minimum;
      
          return random.toFixed(precision);
        }
      
       //call Number.random(0,10.10,3)
      

      【讨论】:

      • Math.floor 会杀死小数,不是吗?
      • 谢谢@YuriyGalanter 我删除了floor 功能
      【解决方案5】:

      由于您尚未定义任何限制 w.r.t。 precision 您可能想要,并牢记 Javascript 中 Number 的限制(准确的数字表示),那么您可能会发现 string 表示是可以接受的。在这种情况下,您可能想要做这样的事情。

      Javascript

      var maxInteger = 9007199254740992;
      
      function randomInteger(minimum, maximum) {
          return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
      }
      
      Number.random = function (minimum, maximum, precision) {
          minimum = typeof minimum !== 'number' ? 0 : minimum;
          minimum = minimum < -maxInteger ? -maxInteger : minimum;
          maximum = typeof maximum !== 'number' || maximum > maxInteger ? maxInteger : maximum;
          precision = typeof precision !== 'number' || precision < 0 ? 0 : precision;
      
          var random = randomInteger(minimum, maximum).toString(),
              decimals;
      
          if (precision) {
              decimals = '';
              while (decimals.length < precision) {
                  decimals += randomInteger(0, maxInteger)
              }
      
              random += '.' + decimals.slice(0, precision);
          }
      
          return random;
      }
      
      console.log(Number.random(-maxInteger, maxInteger, 40));
      

      开启jsFiddle

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 2016-01-26
        • 1970-01-01
        • 2011-02-11
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 2013-08-10
        相关资源
        最近更新 更多