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));
}
}
不知道方案二还能不能优化下