Javascript random()返回大于1的值?

Javascript random()返回大于1的值?,javascript,google-chrome,random,v8,parseint,Javascript,Google Chrome,Random,V8,Parseint,在玩JavaScript中的随机数时,我发现了一个令人惊讶的错误,可能是在Google Chrome的V8 JavaScript引擎中。考虑: //生成一个随机数[1,5]。 var rand5=函数(){ 返回parseInt(Math.random()*5)+1; }; //返回超过最大时间的样本分布。 var testRand5=函数(距离,最大值){ 如果(!dist){dist={};} 如果(!max){max=5000000;} 对于(var i=0;i我建议将随机数函数更改为:

在玩JavaScript中的随机数时,我发现了一个令人惊讶的错误,可能是在Google Chrome的V8 JavaScript引擎中。考虑:

//生成一个随机数[1,5]。
var rand5=函数(){
返回parseInt(Math.random()*5)+1;
};
//返回超过最大时间的样本分布。
var testRand5=函数(距离,最大值){
如果(!dist){dist={};}
如果(!max){max=5000000;}

对于(var i=0;i我建议将随机数函数更改为:

var rand5 = function() {
  return(Math.floor(Math.random() * 5) + 1);
};
这将可靠地生成一个介于1和5之间(包括1和5)的整数值

您可以在此处看到正在运行的测试函数:

在这种情况下,
parseInt
不是最好的选择,因为它将把你的浮点转换成一个字符串,可以是多种不同的格式(包括科学记数法),然后尝试从中解析出一个整数。最好直接用
Math.floor()操作浮点

当然,这是一个gotcha。它首先将其参数转换为字符串,这可以强制使用科学符号,这将导致parseInt执行如下操作:

var x = 0.000000004;
(x).toString(); // => "4e-9"
parseInt(x); // => 4

愚蠢的我…

当您碰巧生成一个非常小的数字,用指数表示时,就会出现边缘情况,例如
9.54605689808655E-8

再加上
parseInt
,它将参数解释为一个字符串,地狱就不复存在了。正如我之前所建议的,它可以用
Math.floor
来解决

请使用以下代码亲自尝试:

var test = 9.546056389808655e-8;

console.log(test); // prints 9.546056389808655e-8
console.log(parseInt(test)); // prints 9 - oh noes!
console.log(Math.floor(test)) // prints 0 - this is better

使用javascript创建等于或大于1的随机数:

<div id="randomNum"></div>

<script type="text/javascript">
var randomN, underone = Math.random(), digits;
digits = "10";
randomN = Math.floor(underone * Math.pow(10, digits));
document.getElementById("randomNum").innerHTML = "Your random number with " + digits + " digits is: " + randomN;
</script>

var randomN,underone=Math.random(),数字;
数字=“10”;
randomN=数学楼层(一个下方*数学功率(10位数字));
document.getElementById(“randomNum”).innerHTML=“您的带有“+位数+”的随机数是:”+randomN;

他的函数是如何生成像7、9和10这样的数字的?@Matt-这可能与没有基数参数的parseInt有关,然后对转换为字符串的十进制数进行操作。所有这些都很糟糕。哇,捕捉得不错。我不知道parseInt甚至先将数字转换为字符串。另一种选择是抛出一个
打字机ror
,这是Java的方式。javascript中的大多数API只是尝试处理无效类型,而不是抛出错误。您的答案没有解决OP的问题,即解释随机数大于1的原因。请查看投票结果以及接受的答案,以了解它们如何解决该特定点同时,也要考虑你的新答案是否能够添加新的、相关的信息,这些信息会给可能错过的问题带来新的理解,或者其他的观众会对现在或将来的问题有所帮助。