对数器的使用

对数器的使用

对数器的定义:

生成随机样本自己对数据作比对的机器。

对数器的背景:

1.在写出一个算法程序的时候,我们往往无法通过手动输入各种各样的测试数据来验证。

2.在一些样本量很大的情况下,我们往往无法考虑到所有的边界情况。

对数器的作用:

检验我们自己所写的算法程序的正确性,并且调整BUG。比如我们用选择排序实现对数组的升序排序,但是我们不确定程序的正确与否,这时候对数器就派上用场了。

实现对数器的步骤:

1.有一个方法A你想要验证它的正确性。

2.实现一个随机样本产生器,如下方的lenRandomValueRandom方法。

3.实现一个绝对正确的方法B用于验证方法A是否正确,如下方的isSorted方法。

4.如果有一个样本出错,即打印出该样本分析方法A哪里出错。

5.如果大样本随机程序都没有出错,那么说明方法A是正确的。

对数器完整程序(以验证选择排序举例):
//	选择排序
public static void selectionSort(int[] arr) {
    if (arr == null || arr.length <= 1) {
        return;
    }
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        swap(arr, i, minIndex);
    }
}
//	数组中作交换
public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

自定义随机数组用于大样本随机测试

/**
	 * Explain:	Math.random()在[0,1)范围内,
	 *			Math.random()*maxLen在[0,maxLen)范围内
	 *			(int) (Math.random() * maxLen)在[0,maxLen-1]范围内
	 * @param maxLen	数组的长度是随机的
	 * @param maxValue	数组的值是随机的
	 * @return			
	 * 返回一个数组arr,arr长度[0,maxLen-1],arr中的每个值[0,maxValue-1]
	 */
	public static int[] lenRandomValueRandom(int maxLen, int maxValue) {
		int len = (int) (Math.random() * maxLen);
		int[] ans = new int[len];
		for (int i = 0; i < len; i++) {
			ans[i] = (int) (Math.random() * maxValue);
		}
		return ans;
	}
//	复制一份数值一样的数组
public static int[] copyArray(int[] arr) {
    int[] ans = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        ans[i] = arr[i];
    }
    return ans;
}
//  判断数组是否是升序排列
public static boolean isSorted(int[] arr) {
    if (arr.length <= 1) {
        return true;
    }
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (max > arr[i]) {
            return false;
        }
        max = arr[i];
    }
    return true;
}

主方法用于测试

主方法运行之后,什么都没有打印,说明我们选择排序升序算法编写成功

否则,打印一个出错的样本,用于我们查找BUG

public static void main(String[] args) {
   int maxLen = 5;
   int maxValue = 1000;
   //	测试次数
   int testTime = 10000;
   for (int i = 0; i < testTime; i++) {
      int[] arr1 = lenRandomValueRandom(maxLen, maxValue);
      //	复制一个tmp数组做备份
      int[] tmp = copyArray(arr1);
      selectionSort(arr1);
      if (!isSorted(arr1)) {
      	//	选择排序出错的例子,拿着这个例子代入出错的程序当中来查找BUG
         for (int j = 0; j < tmp.length; j++) {
            System.out.print(tmp[j] + " ");
         }
         System.out.println();
         System.out.println("选择排序错了!");
         break;
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值