Java对数器验证算法详解

 更新时间:2023年04月12日 11:46:14   作者:ziop-三月  
这篇文章主要介绍了Java对数器验证算法,Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差。但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了

对数器验证算法的正确性

对数器介绍

1.有一个你想要测的方法a;

2.实现一个绝对正确但是复杂度不好的方法b;

3.实现一个随机样本产生器;

4.实现对比算法a和b的方法;

5.把方法a和方法b比对多次来验证方法a是否正确;

6.如果有一个样本使得比对出错,打印样本分析是哪个方法出错;

7.当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

我们在写算法的时候很多情况下可能是应为没有案例测试而找不到bug,而通过对数器我们可以很方便的进行大量的样本测试,在这些样本中找到算法中不正确的案例,通过这些案例我们就能够发现我们的的程序出错在哪?如果大样本我们的程序都没有出错那么我们的程序也就可以理解为是正确的了。

/**
 * 生成一个长度为 0-maxLength 的 int 数组,范围是 [minValue,maxValue)<br/>
 * 只有正数 无负数<br/><br/>
 * <p>
 * 用法:<br/>
 * int[] array = ArrayTools.randomArray(20, 5, 10);<br/>
 * for (int i : array) {<br/>
 * &nbsp;&nbsp;&nbsp;&nbsp;System.out.print(i + " ");<br/>
 * }<br/>
 * 结果如下:<br/>
 * 8 7 7 8 9 7 5 5 9 9 6 5 8 8 7 6 9 7 8 5<br/>
 *
 * @param maxLength 数组长度
 * @param minValue  生成的数值都大于等于  minValue
 * @param maxValue  生成的数值都小于  maxValue
 * @return 生成一个长度为 0-maxLength 的 int 数组,范围是 [minValue,maxValue)
 * @throws IndexOutOfBoundsException 左边界不能大于右边界
 */
public static int[] randomArray(int maxLength, int minValue, int maxValue) {
    int[] array = new int[random(0, maxLength + 1)];
    if (minValue > maxValue) {
        throw new IllegalArgumentException("左边界不能大于右边界");
    }
    int range = maxValue - minValue;
    for (int i = 0; i < array.length; i++) {
        array[i] = (int) (Math.random() * range) + minValue;
    }
    return array;
}
/**
 * 生成一个 在 [minValue,maxValue) 的随机整数
 * @param minValue  最小值
 * @param maxValue  最大值
 * @return 在 [minValue,maxValue) 的随机整数
 */
public static int random(int minValue, int maxValue) {
    if (minValue > maxValue) {
        throw new IllegalArgumentException("左边界不能大于右边界");
    }
    int rang = maxValue - minValue;
    return (int) (Math.random() * rang) + minValue;
}
/**
 * 检验数组是否是升序排列
 * @param arr  待检查数组
 * @return  检查结果  
 */
public static boolean isSorted(int[] arr) {
    if (arr.length < 2) {
        return true;
    }
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (max > arr[i]) {
            return false;
        }
        max = Math.max(max, arr[i]);
    }
    return true;
}
/**
 * 交换 arr 数组当中 i 位置和 j 位置的元素
 * @param arr  待交换数组
 * @param i  第一个元素位置
 * @param j  第二个元素位置
 */
private static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
/**
 *  选择排序
 * @param arr 待排序数组
 */
public static void selectionSort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    int N = arr.length;
    for (int i = 0; i < N; i++) {
        int minValueIndex = i;
        for (int j = i + 1; j < N; j++) {
            minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;
        }
        swap(arr, i, minValueIndex);
    }
}
public static void main(String[] args) {
    int maxLength = 50;
    int maxValue = 1000;
    int testTimes = 1000000;
    for (int i = 0; i < testTimes; i++) {
        int[] arr1 = randomArray(maxLength, 0, maxValue);
        int[] arr2 = arr1.clone();
        selectionSort(arr1);
        if (!isSorted(arr1)) {
            printArray(arr2);
            System.out.println("选择排序错了");
            break;
        }
    }
}

对数器模板

介绍:

该对数器会对我们写的 target() 函数 进行 500000 ,每次目标数组是最大长度为 maxLength 最大值为maxValue 的整数数组, 目标值是生成一个最大值为maxValue 的整数,通过检验两个函数的计算结果来比对我们写的函数是否正确的方法。

如果我们的函数在高达 50万次 的测试中都正确,那么就可以说明我们的函数是正确的。

  • testTimes 函数的测试次数
  • randomArray(maxLength, maxValue) 生成一个 最大长度为 maxLength 最大值为maxValue 的整数数组
  • random(0, maxValue); 生成一个最大值为maxValue 的整数
  • test(arr, num) 通过暴力方法写的低效率函数,但是保证正确率是100%
  • target(arr, num) 我们自己写的高效率的函数,不保证100%正确,通过对数器进行检验模板的正确性
public static void main(String[] args) {
    int testTimes = 500000;
    int maxLength = 50;
    int maxValue = 100;
    boolean success = true;
    for (int i = 0; i < testTimes; i++) {
        int[] arr = randomArray(maxLength, maxValue);
        Arrays.sort(arr);
        int num = random(0, maxValue);
        if (target(arr, num) != test(arr, num)) {
            success = false;
            printArray(arr);
            System.out.println(num);
            System.out.println("判断出错");
            System.out.println("目标函数结果 = " + target(arr, num));
            System.out.println("测试函数结果 = " + test(arr, num));
            break;
        }
    }
    System.out.println(success ? "LUCK" : "Fucking fucked");
}

到此这篇关于Java对数器验证算法详解的文章就介绍到这了,更多相关Java对数器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • spring cloud如何修复zuul跨域配置异常的问题

    spring cloud如何修复zuul跨域配置异常的问题

    最近的开发过程中,使用spring集成了spring-cloud-zuul,在配置zuul跨域的时候遇到了问题,下面这篇文章主要给大家介绍了关于spring cloud如何修复zuul跨域配置异常的问题,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 详解Vue响应式的部分实现

    详解Vue响应式的部分实现

    响应式,简单来说当数据发生变化时,对数据有依赖的代码会重新执行。这篇文章主要为大家介绍了Vue中响应式的部分实现,感兴趣的可以了解一下
    2022-12-12
  • Spring Boot中KafkaListener的介绍、原理和使用方法案例详解

    Spring Boot中KafkaListener的介绍、原理和使用方法案例详解

    本文介绍了Spring Boot中 @KafkaListener 注解的介绍、原理和使用方法,通过本文的介绍,我们希望读者能够更好地理解Spring Boot中 @KafkaListener 注解的使用方法,并在项目中更加灵活地应用
    2023-09-09
  • 一文带你学会Java网络编程

    一文带你学会Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。这篇文章将带大家深入了解一下Java的网络编程,需要的可以了解一下
    2022-08-08
  • java图片验证码生成教程详解

    java图片验证码生成教程详解

    这篇文章主要为大家详细介绍了java图片验证码生成教程,从简单到复杂,从本地到前后台,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • java编程基础之模仿用户登录代码分享

    java编程基础之模仿用户登录代码分享

    这篇文章主要介绍了java编程基础之模仿用户登录代码分享,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • SpringBoot读取配置文件的四种方式

    SpringBoot读取配置文件的四种方式

    在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/main/resources 目录下的 application.properties 或 application.yml 文件中读取配置,本文介绍了SpringBoot读取配置文件的四种方式,需要的朋友可以参考下
    2024-08-08
  • Java中字符串与日期类型的相互转换示例代码

    Java中字符串与日期类型的相互转换示例代码

    这篇文章主要给大家介绍了关于Java中字符串与日期类型的相互转换的相关资料,将Java(或任何编程语言)中的字符串转换为日期是一项基本技能,对于在项目上进行工作很有用需要的朋友可以参考下
    2023-08-08
  • 学习Java之自定义异常与NullPointerException的处理

    学习Java之自定义异常与NullPointerException的处理

    有时候Java自身提供的异常类并不能很好地表达我们的需求,所以这时候我们就可以自定义异常,也就是说,我们可以制造出一个自己的异常类,这样就可以抛出或捕获自己的异常了,本文就给大家详细讲讲Java自定义异常与NullPointerException的处理
    2023-08-08
  • Java实现批量合并Excel工作表

    Java实现批量合并Excel工作表

    这篇文章主要为大家详细介绍了如何使用Java快速实现批量Excel工作表的合并,文中的示例代码代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论