经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
测试数据之自动生成
来源:cnblogs  作者:GodBMW  时间:2018/9/25 20:39:01  对本文有异议

最近在学习排序算法的时候,需要利用程序自动生成测试数据,代码和思路整理在这篇文章里面。

文章图片来源于 GitHub,网速不佳的朋友请点我看原文

顺便软广一下个人技术小站:https://godbmw.com。欢迎常来 ?(^?^*)

1. 设计思路

因为会被很多排序算法调用,所以,数据自动生成代码应该放在.h头文件中。为了防止命名冲突,函数被封装在“命名空间”中(代码中命名空间是: SortTestHelper)。

而对于排序来说,自动生成数据的类型需要有以下几种:

  1. [a, b]范围内的n个随机数据,比如:1、2、100、-1...
  2. n个近乎有序的数据,比如:1、2、3、7、5、6、4...
  3. n个近乎相同的数据,比如:1、1、1、2、2、2、2、2...

除此之外,还需要数组浅拷贝、打印的函数,以及验证是否排序成功和测试排序时间的函数。

2. 用的知识点

  1. srand(time(NULL))rand() : 设立随机种子,生成随机数
  2. clock() : 用来算法运行前后的计算时钟周期差值,再除以CLOCKS_PER_SEC 即为运行秒数。
  3. 函数式编程 : 使用函数指针,方便调用和测试排序函数

其中rand()函数能生成 0 到MAX_INT之间的随机整数。如果想生成[0, n)之间的整数,需要取余操作:int x = rand() % n;;如果想生成[left, right]之间的整数,需要进行偏移:int x = rand() % (right - left + 1) + left;

3. 代码实现

  1. //
  2. // Created by GodBMW.com on 2018/9/11.
  3. //
  4. #ifndef BASESORT_SORTHELPER_H
  5. #define BASESORT_SORTHELPER_H
  6. #include <iostream>
  7. #include <string>
  8. #include <ctime>
  9. #include <cassert>
  10. using namespace std;
  11. namespace SortTestHelper {
  12. // 生成[left, right]范围内n个随机数
  13. template <typename T>
  14. T* generateRandomArray(int n, int left, int right) {
  15. assert( left <= right );
  16. T *arr = new T[n];
  17. srand(time(NULL)); // set random seed
  18. for(int i = 0; i < n; i++) {
  19. arr[i] = rand() % (right - left + 1) + left;
  20. }
  21. return arr;
  22. }
  23. // 生成[0, n)范围内n个近乎有序的随机数
  24. template <typename T>
  25. T* generateNearlyOrderedArray(int n, int swap_times) {
  26. T *arr = new T[n];
  27. srand(time(NULL));
  28. // 先生成长度为n的有序数组
  29. for(int i = 0; i < n; i++) {
  30. arr[i] = i + 1;
  31. }
  32. // 随机选取其中2个数据,交换 swap_times 次
  33. for(int i = 0; i < swap_times; i++) {
  34. int pos_x = rand() % n;
  35. int pos_y = rand() % n;
  36. swap(arr[pos_x], arr[pos_y]);
  37. }
  38. return arr;
  39. }
  40. template <typename T>
  41. T* copyArray(T arr[], int length) {
  42. T* brr = new T[length]; // 注意检查brr数组大小
  43. copy(arr, arr + length, brr);
  44. return brr;
  45. }
  46. template <typename T>
  47. void printArray(T arr[], int length) {
  48. for(int i = 0; i < length; i++) {
  49. cout<< arr[i] << " ";
  50. }
  51. cout<< endl;
  52. return;
  53. }
  54. template <typename T>
  55. bool isSorted(T arr[], int length) {
  56. for(int i = 0; i < length-1; i++) {
  57. if(arr[i] > arr[i + 1]) {
  58. return false;
  59. }
  60. }
  61. return true;
  62. }
  63. // 第三个参数是函数指针,传入后,可以在本函数内运行被传入的函数
  64. template <typename T>
  65. void testSort(T arr[], int length, void(*sort)(T[], int), string name) {
  66. clock_t startTime = clock();
  67. sort(arr, length);
  68. clock_t endTime = clock();
  69. assert(isSorted(arr, length));
  70. cout << name << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " seconds" << endl;
  71. // endTime - startTime: 时钟周期
  72. return;
  73. }
  74. }
  75. #endif //BASESORT_SORTHELPER_H

我们没有实现第二部分所说的 生成n个近乎相同的数据,比如:1、1、1、2、2、2、2、2...。因为可以借助 generateRandomArray 函数,比如:SortTestHelper::generateRandomArray(10000, 0, 10)。生成[0,10]区间内 10000 个整数,那么不就是近乎相同的吗?

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号