拜托,有人可以向我解释为什么我们需要使用下面的代码(或公式)定义最小和最大范围?
Math.floor(Math.random() * (max - min + 1)) + min
更明确地说,为什么从最大值减去min + 1到在parenthisis之后添加min。
提前致谢。
答案 0 :(得分:1)
首先必须解决的是“1到5之间的整数”意味着什么。从技术上讲,只有2,3和4 之间的,但你可能想要1,2,3,4或5。
函数Math.random()为您提供介于0.0000000000000000和0.9999999999999998之间的数字。
要从此值获取整数,例如在20到30之间,首先必须计算范围:range = max - min
。然后将范围(在这种情况下30 - 20 = 10)与Math.random的结果相乘,结果被覆盖(向下舍入),舍入结果为0,1,2,3,4,5,6 ,7,8或9.请注意,缺少数字10。之后添加最小值(20),结果为20,21,22,23,24,25,26,27,28或29。
如果range = 10,你将它与Math.random()给出的最大值相乘,得到9.9999999999999998,当你在它上面运行Math.floor时,它变为9.所以范围是10,你的可以得到0,1,2,3,4,5,6,7,8,9。请注意,你永远不能得到10的值。
因此,它取决于您对“20到30之间的整数”的定义。它应该包括最高数字(30)吗?
如果它应包含最高编号,则需要在范围中添加一个(就像您的代码一样)。这就是范围计算为(max - min + 1)
的原因。
function random(min, max) {
let range = max - min + 1;
return Math.floor( Math.random() * range ) + min
}
setInterval(
function() {
let min = Math.min( input1.value, input2.value );
let max = Math.max( input1.value, input2.value );
outputRange.value = max - min + 1;
let li = document.createElement('li');
li.textContent = random(min,max);
output.insertBefore(li, output.firstChild);
while (output.children.length > 10) {
output.removeChild(output.lastChild);
}
},
200
)
label { display:block }
label span { display:inline-block; width:5em;}
label span, input, output { text-align:right; }
input, output { display:inline-block; width:5em; }
<label><span>Min:</span><input id="input1" type="number" value="1"></label>
<label><span>Max:</span><input id="input2" type="number" value="10"></label>
<label><span>Range:</span><output id="outputRange"></output></label>
<ul id="output"></ul>
可以使用
Math.round(向上或向下舍入到最接近的整数)来代替Math.floor,这样就不需要在范围中添加一个。但是,将来会阅读您的代码的人不会知道这是否是故意的。通过使用地板并在范围中添加一个,您可以清楚地了解您的代码,而无需撰写任何评论。