教你如何用C++快速生成1000万个随机数

来源:互联网 发布:美国经济数据网站 编辑:程序博客网 时间:2024/06/06 12:39

updated: 2012.5.10

上个星期天(2012.5.6)中午去华科参加了百度的笔试,试卷的最后一题是问百度搜索框的suggestion提示功能如何实现,用什么数据结构和算法。

我简单地提及了一下Top K。

前段时间看过算法大牛JULY博客中的一些面试题,其中有讲到Top K算法。且《编程之美》中也有一节专门讲解Top K。现如今百度也考到了,说明Top K算法真的是太重要了。可惜之前都只是粗浅地看了一遍,没有彻底领悟。现在正在着手于Top K的学习,代码写好了需要海量测试数据,上哪找呢?哼哼,当然是自己写程序生成啦。下面将介绍一种方法来随机生成1000万个随机数,并将数据保存到文件data.txt中,方便我们随时进行测试。

精华部分:

srand(unsigned(time(0));//随机种子,为了提高不重复的概率
   rand()%(MAX-MIN + 1) + MIN;                //生成的随机数值在MIN和MAX之间(包含MIN,MAX)

请直接看代码,所有重要信息均在上面。

[cpp] view plaincopy
  1. /* 
  2. 本程序实现的功能: 
  3. 生成1000万个可能重复的随机数,用作测试数据  
  4. 并计算生成这些数据所用的时间  
  5. */  
  6. #include <iostream>  
  7. #include <ctime> // time.h也可,用于计算程序运行时间和生成随机种子数   
  8. using namespace std;  
  9. #define SELF_RAND_MAX 0x7FFFFFFF  
  10. int main()  
  11. {  
  12.  //typedef long clock_t   
  13.  clock_t start_time = clock();//计时开始  
  14.    
  15.     srand(unsigned(time(0)));//生成时间种子  
  16.  //生成的数值在1000到1000万之间   
  17.     const int MAX = 10000000;  
  18.     const int MIN = 1000;  
  19.     /*读入数据 freopen("in.txt","r",stdin);  
  20.  //写入数据 freopen("out.txt","w",stdout); 
  21.  //fclose(stdin);//关闭文件  
  22.     //fclose(stdout);//关闭文件  
  23.     把标准输入流stdin重定向到in.txt文件中, 
  24.  这样在用scanf或是用cin输入时便不会从标准输入流读取数据, 
  25.  而是从in.txt文件中获取输入。 
  26.  只要把输入数据事先粘贴到in.txt,调试时就方便多了。  
  27.     */  
  28.   freopen("data.txt","w",stdout);  
  29.   //cout << "---Generate 10,000,000 random numbers\  
  30.   //         which maybe repeated---" << endl;  
  31.  for(int i = 0; i < 10000000; ++i){  
  32.   //#define RAND_MAX 0x7FFF  
  33.     //较标准unsigned long data = ( MAX * rand() )/ ( RAND_MAX + MIN)+ 1;  
  34.     //unsigned long data = (MAX - MIN + 1 ) * rand() + MIN;  
  35.    //unsigned long data = ((MAX - MIN + 1 ) * rand()   + MIN) % 10000000;  
  36.    unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准   
  37.     cout << data << ' '//输出数据到data.txt   
  38.  }  
  39.  fclose(stdout);  
  40.  freopen("time.txt","w",stdout);  
  41.  cout << endl   
  42.       << "---the end---"   
  43.    << endl;  
  44.    //CLOCKS_PER_SEC控制精度,在windows环境下是1000,linux下是多少完了  
  45.    //简单地说windows下是毫秒级,而linux下是纳秒级   
  46.     cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC  
  47.          << 's' << endl;  
  48.   //  fclose(stdout);  
  49. }  
运行结果:

time.txt中

---the end---

elapsed time:5.171s

生成的data.txt有55M之多。共有1000万个数据,通过下面的测试程序可以断定,这1000万个数据的值均在1000-10000000之间。

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <ctime>  
  3. //#include <boost/timer.hpp>  
  4. //using namespace boost;  
  5. using namespace std;  
  6. int main(){  
  7.     unsigned long data;  
  8.     //timer t;  
  9.     int len = 0;  
  10.     freopen("data.txt","r",stdin);  
  11.     while(cin >> data){  
  12.       if(data >= 1000 && data <=10000000)  
  13.       {  
  14.         //cout << data << endl;  
  15.      len++;   
  16.       }  
  17.     }  
  18.     cout << len << endl;  
  19.      // cout << t.elapsed() << endl;  
  20. }  


运行结果为10000000

另外如何生成不重复的1000万个数?这是个非常大的挑战,待日后解决。

好吧,继续投入Top K的学习。

0 0
原创粉丝点击