最近在补JavaSrcipt的知识,忽然想起JavaSE的时候学的Math.random()产生随机数,于是上网查了下返回指定范围的随机数(m-n之间包括边界)的公式:
Math.random()*(n+1-m)+m
稍微思考了下,个人的见解,不喜勿喷
首先是Math.random()会产生一个[0,1)之间的随机数,其次,由于随机范围中包含0的情况,所以不指望全靠乘法来进行区间限制,必须要加法的参与(除0以外的除法和减法都能转化成乘法加法,而0除以0没有意义所以这里不谈)。乘法可以变化区间的长度,而加法又是区间的整体位移不会改变区间的整体长度,则最后都是要通过加法来最后确定最终的区间范围,即最终都是[0,1)* 一个数a+位移长度b 来得到最终[m,n]的范围,则可知位移长度b为m,因此转化成范围[m,a+m),对比我们的目标区间[m,n],则易知当a+m=n+1的时候满足条件,所以得a的值为n+1-m,所以公式就是 Math.random()*(n+1-m)+m.
由此可知当要返回[m,n)不包含n的范围时,a=n-m,而此时的公式就变成了
Math.random()*(n-m)+m
或者还有种简单的理解方式,既然乘法改变的是区间的长度,则m,n之间的长度为n-m,Math.random()的长度为1,则需要乘(n-m)来确定区间的长度,再用加法平移区间,最后再根据给定的范围是否包括边界来确定是否+1