当前位置:   article > 正文

C/C++中设置随机数

C/C++中设置随机数

前言

        我们通常在写一个数据结构后,需要去测试其正确性和性能比较,那在平常手动输入数据的方式太鸡肋,并且不具有普遍性和随机性。基于这个原因,我们必须要掌握设置随机数,不但可以给我们提供更多的数据,还可以让数据具有普遍意义,满足我们的测试需求。

一、有关随机数的函数

1. srand

void srand (unsigned int seed);

函数解析: 

        seed就相当于一颗种子,srand函数会种这个随机数种子,种子对应一个随机数,后面使用rand函数可以接收这个随机数。

        经过测试:当我们的种子是固定的,每次程序运行时,rand获得的随机数也是固定的,无法做到在一个程序里获得真正意义的随机数,所以参数通常使用的是time(NULL),time函数是获得系统的时间,因为系统的时间一直在变,那种子就也都是不同的,所以每次程序运行时,rand获得的数,也一直在变,这才是真正意义的随机数。

为什么参数一定时,获得的随机数是固定的?

        首先计算机并不能产生真正的随机数,而是将一些无规则排列的数字存储在电脑里,再把这些数字划分为相等的N份,并为每份加上一个编号。用srand()函数获取这个编号,然后rand()就按顺序获取这些数字。

头文件:

#include <stdlib.h>

参数seed:

推荐使用time(NULL),用时间做参数,可以保证每次程序运行时,生成的随机数是随机的

time函数头文件:#include <time.h>

返回值:

无返回值

2. rand

int rand (void);

头文件:

#include <stdlib.h>

函数解析:

        得到srand生成的随机数,并返回这个随机数

返回值:

        返回的是随机数,范围0~RAND_MAX(RAND_MAX = 2147483647)

二、测试模版

  1. int main()
  2. {
  3. const size_t N = 10000;
  4. unordered_set<int> us; //容器1
  5. set<int> s; //容器2
  6. vector<int> v; //使用vector保存插入的数据
  7. v.reserve(N); //防止多次扩容,造成消耗,提前一次预留N个空间
  8. srand(time(nullptr)); //种随机数种子,使用time做参数,可以保证每次运行,都是不一样的
  9. for (size_t i = 0; i < N; ++i)
  10. {
  11. v.push_back(rand()); // N比较大时,重复值比较多
  12. //v.push_back(rand()+i); // 重复值相对少
  13. //v.push_back(i); // 没有重复,有序
  14. }
  15. //测试容器插入的性能
  16. size_t begin1 = clock();
  17. for (auto& e : v)
  18. {
  19. s.insert(e);
  20. }
  21. size_t end1 = clock();
  22. cout << "set insert:" << end1 - begin1 << endl;
  23. size_t begin2 = clock();
  24. for (auto& e : v)
  25. {
  26. us.insert(e);
  27. }
  28. size_t end2 = clock();
  29. cout << "unordered_set insert:" << end2 - begin2 << endl;
  30. //测试容器查找的性能
  31. size_t begin3 = clock();
  32. for (auto& e : v)
  33. {
  34. s.find(e);
  35. }
  36. size_t end3 = clock();
  37. cout << "set find:" << end3 - begin3 << endl;
  38. size_t begin4 = clock();
  39. for (auto& e : v)
  40. {
  41. us.find(e);
  42. }
  43. size_t end4 = clock();
  44. cout << "unordered_set find:" << end4 - begin4 << endl << endl;
  45. cout <<"插入数据个数:"<< s.size() << endl;
  46. cout <<"插入数据个数:" << us.size() << endl << endl;
  47. //测试容器删除的性能
  48. size_t begin5 = clock();
  49. for (auto& e : v)
  50. {
  51. s.erase(e);
  52. }
  53. size_t end5 = clock();
  54. cout << "set erase:" << end5 - begin5 << endl;
  55. size_t begin6 = clock();
  56. for (auto e : v)
  57. {
  58. us.erase(e);
  59. }
  60. size_t end6 = clock();
  61. cout << "unordered_set erase:" << end6 - begin6 << endl << endl;
  62. return 0;
  63. }

三、反思与总结

        由于目前能力不足,还需要仔细研究源码中srand和rand的底层实现,在未来某段时间会更新剖析源码实现
random.c source code [glibc/stdlib/random.c] - Codebrowser

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/463009
推荐阅读
相关标签
  

闽ICP备14008679号