一、Java提供的API
在Java SE中,java.util.Random类中提供了产生随机数的API,如下图所示:
返回从随机数生成器序列中提取的,均匀分布在0(包含)和指定值,即参数bound(不包含)之间的一个int类型的伪随机数。
简而言之,就是返回[0,bound)区间中的一个int值。
二、返回指定范围的随机数
Java SE中的API,没有提供可以直接指定一个具体范围的方法,因此,需要我们自己稍微转化一下代码逻辑。
假设你想要在范围[l,r]中产生随机数(0 <= l < r),我们可以将范围向左偏移l,产生的随机数之后在向右偏移l, 即[0, r - l] + l,它和在区间[l,r]上产生随机数是等价的。
现举例说明为什么在[0, r - l]之间产生随机数,等价于在[0, r - l + 1)之间产生随机数。这个问题Java提供的API是可以解决的,最后再加上向右的偏移l,原文题就解决了。
nextInt(r - l + 1) + l
例如,你想在范围[5, 21]之间产生随机数,只需这样:nextInt(21 - 5 + 1) + 5
,方法nextInt()
的返回值为[0,bound),对于本方法调用是[0,21 - 5 + 1),即[0, 17),其等价于[0,16]。最后加上l (l 为 5), [0, 16] + 5 等价于[5, 21]。