package com.nit.superlu.Junit;public class Test6 { public static void main(String[] args) { run(1); run(2); run(3); } /** * 方案一:逐位随机取值,转成字符串,然后再拼接成6位的字符串 * * @return 6位字符串 */ public static String getRandNumber1() { StringBuffer numStr = new StringBuffer(); int num; for (int i = 0; i < 6; i++) { // Math.random() 随机出0-1之间的实数,返回值是一个double 类型的 num = (int) (Math.random() * 10); numStr.append(String.valueOf(num)); } return numStr.toString(); } /** * 方案二:随机出来的数乘上900000 得到一个0-900000的数,再加上100000就得到100000-1000000的六位数 * * 弊端:第一位为0的情况被排除 * * * @return 最多6位的整数 */ public static int getRandNumber2() { int num = (int) (Math.random() * 900000) + 100000; return num; } /** * 方案三:将随机出来的数,直接转成字符串,然后截取小数点后六位。 * * 弊端:效率较低, * * 因为调用substring(int beginIndex, int endIndex) 时,它内部又需要调用String(value, * beginIndex, subLen) 构造器 * * String(value, beginIndex, subLen) 内部又要调用Arrays.copyOfRange(value, offset, * offset+count) 方法 * * Arrays.copyOfRange(value, offset, offset+count) 内部又调用了一个方法,这个方法的实现不是用java * 编写的,然后才返回结果 * * 一圈下来所以耗费时间 * * @return 六位的字符串 */ public static String getRandNumber3() { String numStr; numStr = String.valueOf(Math.random()); // subString(int begin,int end); 截取[begin,end)范围内的字符串 return numStr.substring(2, 8); } /** * 测试一下每个函数运行的效率,循环个10万次 * * @param n * 指定哪个函数 */ public static void run(int n) { long start = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { if (n == 1) { getRandNumber1(); } if (n == 2) { getRandNumber2(); } if (n == 3) { getRandNumber3(); } } long end = System.currentTimeMillis(); System.out.PRintln(("getRandNumber" + n + ": ") + (end - start)); }}
不知道方案二还能不能优化下
新闻热点
疑难解答