用数学的方法证明利用Random工具取区间[a,b)内随机数的算法
2014-08-22 20:32
465 查看
经常在网上看到一种用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)
所以得证。
证明过程很简单,主要思想是等价代换,思考的时候要用到分析法,即从目标到条件一步步接近。
下面是代码表示的算法:
已知: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; }
相关文章推荐
- 利用Math.Random()方法来生成随机数。(转)
- C#利用Random得随机数求均值、方差、正态分布的方法
- 一个利用随机数加密字串的算法
- 一个不等式高等数学方法证明
- 用数学的方法来写算法
- 利用/dev/random生成随机数
- 利用HTTP的POST方法做个在线翻译的小工具
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- linux shell实现随机数多种方法(date,random,uuid)
- 利用PL/SQL Developer工具在Oracle库中创建同名词Synonym的方法
- 算法问题征解:怎样生成随机数而不借助任何工具?
- 利用HTTP的POST方法做个在线翻译的小工具
- 利用随机数加密字串的算法
- linux shell实现随机数多种方法(date,random,uuid)
- 直接利用工具将prn文件打印到打印机的方法
- 用数学的方法来写算法-续
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- 我的本科毕业设计(非水文,设计了一个新算法):一种字符编码猜测工具的实现方法
- 利用数学证明方式验证程序的可靠性(一)
- 利用数学证明方式验证程序的可靠性(二)