隨機生成算法測試用例


測試算法時,經常使用隨機數,針對排序算法測試,建立一個名字空間SortTestHelper

1 namespace SortTestHelper
2 {
3     int* generateRandomArray(int n,int rangeL,int rangeR);//生成隨機數組
4     void printArray(int *arr,int n);//打印數組
5     template<typename T> bool isSorted(T *arr,int n);//判斷是否成功排序
6     template<typename T> void testSort(string sortName,void(*sort)(T [],int),T arr[],int n);//測試排序時間並打印
7 }

生成隨機數組時,三個參數分別為元素個數,元素下限和元素上限。

在這個函數中,默認rangR>rangeL,所以在函數中使用了assert(rangeR>rangeL),如果括號內成立,則繼續運行,不成立則打斷。

生成隨機數的方式是使用srand和rand()配合產生偽隨機數序列,rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的“隨機”。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列。

 1     //生成有n個元素的隨機數組,每個數組元素范圍為[rangeL,rangeR]
 2     int* generateRandomArray(int n,int rangeL,int rangeR)
 3     {
 4         assert(rangeR>rangeL);
 5         int *arr=new int[n];
 6         srand(time(NULL));
 7         for(int i=0;i<n;i++)
 8             arr[i]=rand()%(rangeR-rangeL+1)+rangeL;
 9         return arr;
10     }
11     
12     void printArray(int *arr,int n)
13     {
14         for(int i=0;i<n;i++)
15             cout<<arr[i]<<" ";
16         cout<<endl;
17     }

在使用隨機數組生成函數后,為數組分配了地址空間,在測試結束后要加delete[] arr,否則會造成內存泄漏。

判斷數組是否排序成功時,構造成了函數模板,進行n-1次循環,如果存在某個元素比其后一個元素大,則返回錯誤

    template<typename T>
    bool isSorted(T *arr,int n)
    {
        for(int i=0;i<n-1;i++)
        {
            if(arr[i]>arr[i+1])
                return false;
        }
        return true;
    }

測試排序時間時,使用了clock()函數,clock()是C/C++中的計時函數,而與其相關的數據類型是clock_t。

clock tick:時鍾計時單元(而不把它叫做時鍾滴答次數),一個時鍾計時單元的時間長短是由CPU控制的,一個clock tick不是CPU的一個時鍾周期,而是C/C++的一個基本計時單位。而與之對應的宏CLOCKS_PER_SEC適用於將計算系統時間類型轉換為用戶可讀的秒時間,包含於頭文件ctime中。

 1     template<typename T>
 2     void testSort(string sortName,void(*sort)(T[],int),T arr[],int n)
 3     {
 4         clock_t startTime=clock();
 5         sort(arr,n);
 6         clock_t endTime=clock();
 7         
 8         assert(isSorted(arr, n));
 9         cout<<sortName<<":"<<double(endTime-startTime)/CLOCKS_PER_SEC<<"s"<<endl;
10         return;
11     }

在函數中,使用了assert()來確定數組是否排序成功,如果成功則繼續運行,不成功則打斷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM