Min Max范围JavaScript

时间:2018-01-16 12:40:22

标签: javascript function math

拜托,有人可以向我解释为什么我们需要使用下面的代码(或公式)定义最小和最大范围?

Math.floor(Math.random() * (max - min + 1)) + min

更明确地说,为什么从最大值减去min + 1到在parenthisis之后添加min。

提前致谢。

1 个答案:

答案 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,这样就不需要在范围中添加一个。但是,将来会阅读您的代码的人不会知道这是否是故意的。通过使用地板并在范围中添加一个,您可以清楚地了解您的代码,而无需撰写任何评论。