在Javascript中生成2个值到2个小数位之间的随机数

Posted

技术标签:

【中文标题】在Javascript中生成2个值到2个小数位之间的随机数【英文标题】:Generate a Random Number between 2 values to 2 decimals places in Javascript 【发布时间】:2018-01-25 21:21:55 【问题描述】:

我想生成一个介于 1 到 10 之间的随机数,最多保留 2 个小数位,

我目前正在使用下面的这个来生成我的号码,

var randomnum = Math.floor(Math.random() * (10.00 - 1.00 + 1.00)) + 1.00;

最后,我想知道如何生成数字,例如:

1.66

5.86

8.34

格式为:var randomnum = 然后是代码

旁注:我不记得我以前为什么生成这样的数字,但记得 Math.random 生成数字到小数点后 8 位。

感谢您的帮助! :)

Ps:我看过很多关于等待向下或向上舍入生成的数字的帖子,但没有找到想要直接生成它们的帖子。

更新:我想要一个数字值而不是看起来像数字的字符串

【问题讨论】:

javascript 中的数字具有它们所具有的精度;尝试将精度限制在小数点后两位没有多大意义。您可以做的是生成 1 到 1000 之间的 整数,然后将它们除以 100,但由于二进制浮点的性质,您最终仍会在小数部分中出现一些“模糊”值。 Get a random number between 0.0200 and 0.120 (float numbers)的可能重复 您可以使用 parseFloat 转换它。有什么问题? 我提供的链接有创建随机十进制数的解决方案,这是您的要求。所以你只需要使用 parseFloat() 转换字符串。这就是你所要做的。 我该怎么做? 【参考方案1】:

您非常接近,您需要的是不要将十进制数作为最小值和最大值。让我们有 max = 1000 和 min = 100,所以在 Math.floor 之后,您需要除以 100:

var randomnum = Math.floor(Math.random() * (1000 - 100) + 100) / 100;

或者如果您想使用小数:

var precision = 100; // 2 decimals
var randomnum = Math.floor(Math.random() * (10 * precision - 1 * precision) + 1 * precision) / (1*precision);

【讨论】:

我把它与我的网站配合得最好,所以谢谢你,“关闭但没有雪茄” 如果我想改变这个等式:是吗? var randomnum = Math.floor(Math.random() * (max - min) + min) / 100; 100 是小数点后两位的精度。查看更新后的帖子【参考方案2】:

将原始随机数乘以10^decimalPlaces,取底,然后除以10^decimalPlaces。例如:

floor(8.885729840652472 * 100) / 100  // 8.88

function genRand(min, max, decimalPlaces)   
    var rand = Math.random()*(max-min) + min;
    var power = Math.pow(10, decimalPlaces);
    return Math.floor(rand*power) / power;


for (var i=0; i<20; i++) 
  document.write(genRand(0, 10, 2) + "<br>");

编辑以响应 cmets: 对于包含浮点随机函数(使用this answer):

function genRand(min, max, decimalPlaces)   
    var rand = Math.random() < 0.5 ? ((1-Math.random()) * (max-min) + min) : (Math.random() * (max-min) + min);  // could be min or max or anything in between
    var power = Math.pow(10, decimalPlaces);
    return Math.floor(rand*power) / power;

【讨论】:

这很好,但genRand(2, 4, 1) 永远不会返回 4.0。您需要在末尾添加一个修饰符,具体取决于max(如果 max @thdoan 是的,上限是独占的。您能否详细说明如何使其具有包容性? clabe45,我正要提交自己的解决方案,直到遇到this solution,所以我要继续使用它(为什么要重新发明***,对吧?:))。 @thdoan 谢谢,不过我不知道这与我的解决方案有何不同,因为我认为不需要Math.min clabe45,不同的是我链接到的那个是 4.0 :)。【参考方案3】:

您可以使用以下代码。

var randomnum = (Math.random() * (10.00 - 1.00 + 1.00) + 1.00).toFixed(2);

【讨论】:

【参考方案4】:

只是为了根据上面的例子在视觉上、数学上和功能上简化事情。

function randomNumberGenerator(min = 0, max = 1, fractionDigits = 0, inclusive = true) 
  const precision = Math.pow(10, Math.max(fractionDigits, 0));
  const scaledMax = max * precision;
  const scaledMin = min * precision;
  const offset = inclusive ? 1 : 0;
  const num = Math.floor(Math.random() * (scaledMax - scaledMin + offset)) + scaledMin;

  return num / precision;
;

Math.max 防止来自fractionDigits 的负小数位

【讨论】:

【参考方案5】:

typescript/angular 示例的更多方式:

getRandom(min: number, max: number) 
  return Math.random() * (max - min) + min;


console.log('inserting min and max values: ', this.getRandom(-10.0, -10.9).toPrecision(4));

获取介于 -10.0 和 -10.9 之间的随机值

【讨论】:

【参考方案6】:

这是另一种尚未提及的方式,它将生成一个介于 1 和 9.99 之间的随机数...

(Math.random() * 8 + 1 + Math.random()).toFixed(2)

console.log((Math.random() * 8 + 1 + Math.random()).toFixed(2))

这是否是最实用的方法完全是另一个问题。

【讨论】:

所以这会返回一个字符串。您可以使用typeof 进行检查。为了让它工作,在它周围包裹一个 parseFloat() 以便输出变成一个数字。【参考方案7】:

一个简单的 javascript 示例,用于生成精确的随机数:

function genRand(min, max, decimalPlaces) 
    return (Math.random() * (max - min) + min).toFixed(decimalPlaces) * 1;


console.log(genRand(-5, 5, 2));

【讨论】:

以上是关于在Javascript中生成2个值到2个小数位之间的随机数的主要内容,如果未能解决你的问题,请参考以下文章

在按周分组的 2 个日期之间在 MYSQL 中生成报告

如何在excel中生成一个在一定范围内的随机数

在javascript中生成随机整数的最快方法是啥?

C语言中,如何实现从文件中读取数据(大量的数据)后,在循环体中使用,每次传递3个值到数组。

在 PostgreSQL 中生成两个日期之间的时间序列

如何在 Dart 中生成大随机数?