在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个小数位之间的随机数的主要内容,如果未能解决你的问题,请参考以下文章