对数器是一种测试工具,它采用的是大量随机数据的方式来对同一个问题的两种不同算法进行测试,进行算法合理及正确性判断。相对于线上测试它更加繁琐,但是准确性更高。
就拿排序算法为例,我们制作很多的随机数组来判断排序算法是否正确。
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* @author `dongxu.kwb`
* @date `2022/8/29`
*/
public class test {
public static void main(String[] args) {
int testTime = 50000; //测试的次数
int maxSize = 100; //长度 [0 ~ 100]
int maxValue = 100; // [-100 ~ 100]
boolean succeed = true; //测试是否成功
for (int i = 0; i < testTime; i++) { //测试开始
int[] arr1 = newRandomArray(maxSize, maxValue); //生成两个相同的随机数组
int[] arr2 = copyArray(arr1);
insertSort(arr1);
Arrays.sort(arr2);
if (!isEqual(arr1, arr2)) { //比较两个数组是否相同
succeed = false;
break;
}
}
System.out.println(succeed ? "恭喜你!两种算法的结果相同。" : "两种算法结果不相同,请进行检查。");
}
/**
* 生成随机数组的方法
*/
public static int[] newRandomArray(int maxSize, int maxValue){
//生成[0~n-1]的所有整数 (int)(Math.random() * n)
int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; //随机数组大小
for (int i = 0; i < arr.length; i++) { //为数组随即赋值
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
/**
* 复制数组的方法
* @param arr
*/
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
/**
* 判断两个数组是否相等的方法
* @param arr1
* @param arr2
* @return
*/
public static boolean isEqual(int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) return false;
if (arr1 == null && arr2 == null) return true;
if (arr1.length != arr2.length) return false;
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) return false;
}
return true;
}
public static void insertSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
swap(arr, j, j-1);
}
}
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b]= temp;
}
}