最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java對數(shù)器驗(yàn)證算法詳解

 更新時(shí)間:2023年04月12日 11:46:14   作者:ziop-三月  
這篇文章主要介紹了Java對數(shù)器驗(yàn)證算法,Java對數(shù)函數(shù)的計(jì)算方法非常有問題,然而在API中卻有驚人的誤差。但是假如運(yùn)用了以下的方法,用Java處理數(shù)字所碰到的小麻煩就可以輕而易舉的解決了

對數(shù)器驗(yàn)證算法的正確性

對數(shù)器介紹

1.有一個(gè)你想要測的方法a;

2.實(shí)現(xiàn)一個(gè)絕對正確但是復(fù)雜度不好的方法b;

3.實(shí)現(xiàn)一個(gè)隨機(jī)樣本產(chǎn)生器;

4.實(shí)現(xiàn)對比算法a和b的方法;

5.把方法a和方法b比對多次來驗(yàn)證方法a是否正確;

6.如果有一個(gè)樣本使得比對出錯(cuò),打印樣本分析是哪個(gè)方法出錯(cuò);

7.當(dāng)樣本數(shù)量很多時(shí)比對測試依然正確,可以確定方法a已經(jīng)正確。

我們在寫算法的時(shí)候很多情況下可能是應(yīng)為沒有案例測試而找不到bug,而通過對數(shù)器我們可以很方便的進(jìn)行大量的樣本測試,在這些樣本中找到算法中不正確的案例,通過這些案例我們就能夠發(fā)現(xiàn)我們的的程序出錯(cuò)在哪?如果大樣本我們的程序都沒有出錯(cuò)那么我們的程序也就可以理解為是正確的了。

/**
 * 生成一個(gè)長度為 0-maxLength 的 int 數(shù)組,范圍是 [minValue,maxValue)<br/>
 * 只有正數(shù) 無負(fù)數(shù)<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/>
 * 結(jié)果如下:<br/>
 * 8 7 7 8 9 7 5 5 9 9 6 5 8 8 7 6 9 7 8 5<br/>
 *
 * @param maxLength 數(shù)組長度
 * @param minValue  生成的數(shù)值都大于等于  minValue
 * @param maxValue  生成的數(shù)值都小于  maxValue
 * @return 生成一個(gè)長度為 0-maxLength 的 int 數(shù)組,范圍是 [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;
}
/**
 * 生成一個(gè) 在 [minValue,maxValue) 的隨機(jī)整數(shù)
 * @param minValue  最小值
 * @param maxValue  最大值
 * @return 在 [minValue,maxValue) 的隨機(jī)整數(shù)
 */
public static int random(int minValue, int maxValue) {
    if (minValue > maxValue) {
        throw new IllegalArgumentException("左邊界不能大于右邊界");
    }
    int rang = maxValue - minValue;
    return (int) (Math.random() * rang) + minValue;
}
/**
 * 檢驗(yàn)數(shù)組是否是升序排列
 * @param arr  待檢查數(shù)組
 * @return  檢查結(jié)果  
 */
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 數(shù)組當(dāng)中 i 位置和 j 位置的元素
 * @param arr  待交換數(shù)組
 * @param i  第一個(gè)元素位置
 * @param j  第二個(gè)元素位置
 */
private static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
/**
 *  選擇排序
 * @param arr 待排序數(shù)組
 */
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("選擇排序錯(cuò)了");
            break;
        }
    }
}

對數(shù)器模板

介紹:

該對數(shù)器會對我們寫的 target() 函數(shù) 進(jìn)行 500000 ,每次目標(biāo)數(shù)組是最大長度為 maxLength 最大值為maxValue 的整數(shù)數(shù)組, 目標(biāo)值是生成一個(gè)最大值為maxValue 的整數(shù),通過檢驗(yàn)兩個(gè)函數(shù)的計(jì)算結(jié)果來比對我們寫的函數(shù)是否正確的方法。

如果我們的函數(shù)在高達(dá) 50萬次 的測試中都正確,那么就可以說明我們的函數(shù)是正確的。

  • testTimes 函數(shù)的測試次數(shù)
  • randomArray(maxLength, maxValue) 生成一個(gè) 最大長度為 maxLength 最大值為maxValue 的整數(shù)數(shù)組
  • random(0, maxValue); 生成一個(gè)最大值為maxValue 的整數(shù)
  • test(arr, num) 通過暴力方法寫的低效率函數(shù),但是保證正確率是100%
  • target(arr, num) 我們自己寫的高效率的函數(shù),不保證100%正確,通過對數(shù)器進(jìn)行檢驗(yàn)?zāi)0宓恼_性
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("判斷出錯(cuò)");
            System.out.println("目標(biāo)函數(shù)結(jié)果 = " + target(arr, num));
            System.out.println("測試函數(shù)結(jié)果 = " + test(arr, num));
            break;
        }
    }
    System.out.println(success ? "LUCK" : "Fucking fucked");
}

到此這篇關(guān)于Java對數(shù)器驗(yàn)證算法詳解的文章就介紹到這了,更多相關(guān)Java對數(shù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • spring cloud如何修復(fù)zuul跨域配置異常的問題

    spring cloud如何修復(fù)zuul跨域配置異常的問題

    最近的開發(fā)過程中,使用spring集成了spring-cloud-zuul,在配置zuul跨域的時(shí)候遇到了問題,下面這篇文章主要給大家介紹了關(guān)于spring cloud如何修復(fù)zuul跨域配置異常的問題,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 詳解Vue響應(yīng)式的部分實(shí)現(xiàn)

    詳解Vue響應(yīng)式的部分實(shí)現(xiàn)

    響應(yīng)式,簡單來說當(dāng)數(shù)據(jù)發(fā)生變化時(shí),對數(shù)據(jù)有依賴的代碼會重新執(zhí)行。這篇文章主要為大家介紹了Vue中響應(yīng)式的部分實(shí)現(xiàn),感興趣的可以了解一下
    2022-12-12
  • Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    本文介紹了Spring Boot中 @KafkaListener 注解的介紹、原理和使用方法,通過本文的介紹,我們希望讀者能夠更好地理解Spring Boot中 @KafkaListener 注解的使用方法,并在項(xiàng)目中更加靈活地應(yīng)用
    2023-09-09
  • 一文帶你學(xué)會Java網(wǎng)絡(luò)編程

    一文帶你學(xué)會Java網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。這篇文章將帶大家深入了解一下Java的網(wǎng)絡(luò)編程,需要的可以了解一下
    2022-08-08
  • java圖片驗(yàn)證碼生成教程詳解

    java圖片驗(yàn)證碼生成教程詳解

    這篇文章主要為大家詳細(xì)介紹了java圖片驗(yàn)證碼生成教程,從簡單到復(fù)雜,從本地到前后臺,感興趣的小伙伴們可以參考一下
    2016-07-07
  • java編程基礎(chǔ)之模仿用戶登錄代碼分享

    java編程基礎(chǔ)之模仿用戶登錄代碼分享

    這篇文章主要介紹了java編程基礎(chǔ)之模仿用戶登錄代碼分享,小編覺得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • SpringBoot讀取配置文件的四種方式

    SpringBoot讀取配置文件的四種方式

    在 Spring Boot 中,application.yml 文件用于配置應(yīng)用程序的屬性,Spring Boot 默認(rèn)會從 src/main/resources 目錄下的 application.properties 或 application.yml 文件中讀取配置,本文介紹了SpringBoot讀取配置文件的四種方式,需要的朋友可以參考下
    2024-08-08
  • Java中字符串與日期類型的相互轉(zhuǎn)換示例代碼

    Java中字符串與日期類型的相互轉(zhuǎn)換示例代碼

    這篇文章主要給大家介紹了關(guān)于Java中字符串與日期類型的相互轉(zhuǎn)換的相關(guān)資料,將Java(或任何編程語言)中的字符串轉(zhuǎn)換為日期是一項(xiàng)基本技能,對于在項(xiàng)目上進(jìn)行工作很有用需要的朋友可以參考下
    2023-08-08
  • 學(xué)習(xí)Java之自定義異常與NullPointerException的處理

    學(xué)習(xí)Java之自定義異常與NullPointerException的處理

    有時(shí)候Java自身提供的異常類并不能很好地表達(dá)我們的需求,所以這時(shí)候我們就可以自定義異常,也就是說,我們可以制造出一個(gè)自己的異常類,這樣就可以拋出或捕獲自己的異常了,本文就給大家詳細(xì)講講Java自定義異常與NullPointerException的處理
    2023-08-08
  • Java實(shí)現(xiàn)批量合并Excel工作表

    Java實(shí)現(xiàn)批量合并Excel工作表

    這篇文章主要為大家詳細(xì)介紹了如何使用Java快速實(shí)現(xiàn)批量Excel工作表的合并,文中的示例代碼代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10

最新評論

章丘市| 平邑县| 大姚县| 忻城县| 洛川县| 吉林省| 赣州市| 漯河市| 谢通门县| 阿荣旗| 常山县| 潍坊市| 横峰县| 黑龙江省| 郯城县| 枝江市| 攀枝花市| 涟源市| 循化| 永吉县| 黔西| 贵州省| 高青县| 德惠市| 开远市| 会东县| 彭泽县| 南丰县| 格尔木市| 永顺县| 平泉县| 新建县| 堆龙德庆县| 宝清县| 台南市| 凤台县| 恭城| 黔江区| 正镶白旗| 新兴县| 七台河市|