经常在网上看到一种用Java的Random工具取某个区间[a,b)内随机数的算法 random.nextInt(b-a)+a,琢磨了一下,想了个数学的方法来证明它,在这里标记备份一下。
已知:random.nextInt(n) 可以取到[0,n)之间的随机数
目标:取[a,b)间的随机数
证明过程:
因为:random.nextInt(n) =〉 [0,n)
所以:random.nextInt(x)+y =〉[0+y,x+y) = [y,x+y)
令:a=y,b=x+y
则:b=a+x =〉 x=b-a
所以:random.nextInt(b-a)+a 〈=〉 random.nextInt(x)+y
所以:random.nextInt(b-a)+a =〉[y,x+y)〈=〉[a,b)
所以得证。
证明过程很简单,主要思想是等价代换,思考的时候要用到分析法,即从目标到条件一步步接近。
下面是代码表示的算法:
/**
* 在区间[start,end)之间取随机数
* @param start 起始数(含)
* @param end 终止数(不含)
* @return 取到的随机数
*/
public final static int random(int start,int end){
final Random aRandom=new Random();
return aRandom.nextInt(end-start)+start;
}