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

来源:互联网 发布:nvidia smi windows 编辑:程序博客网 时间:2024/05/20 21:47

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)

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

/*本程序实现的功能:生成1000万个可能重复的随机数,用作测试数据 并计算生成这些数据所用的时间 */#include <iostream>#include <ctime> // time.h也可,用于计算程序运行时间和生成随机种子数 using namespace std;#define SELF_RAND_MAX 0x7FFFFFFFint main(){ //typedef long clock_t  clock_t start_time = clock();//计时开始     srand(unsigned(time(0)));//生成时间种子 //生成的数值在1000到1000万之间     const int MAX = 10000000;    const int MIN = 1000;    /*读入数据 freopen("in.txt","r",stdin);  //写入数据 freopen("out.txt","w",stdout); //fclose(stdin);//关闭文件     //fclose(stdout);//关闭文件     把标准输入流stdin重定向到in.txt文件中, 这样在用scanf或是用cin输入时便不会从标准输入流读取数据, 而是从in.txt文件中获取输入。 只要把输入数据事先粘贴到in.txt,调试时就方便多了。     */  freopen("data.txt","w",stdout);  //cout << "---Generate 10,000,000 random numbers\  //         which maybe repeated---" << endl; for(int i = 0; i < 10000000; ++i){  //#define RAND_MAX 0x7FFF    //较标准unsigned long data = ( MAX * rand() )/ ( RAND_MAX + MIN)+ 1;    //unsigned long data = (MAX - MIN + 1 ) * rand() + MIN;   //unsigned long data = ((MAX - MIN + 1 ) * rand()   + MIN) % 10000000;   unsigned long data = rand() % (MAX - MIN + 1) + MIN;//较标准     cout << data << ' '; //输出数据到data.txt  } fclose(stdout); freopen("time.txt","w",stdout); cout << endl       << "---the end---"    << endl;   //CLOCKS_PER_SEC控制精度,在windows环境下是1000,linux下是多少完了   //简单地说windows下是毫秒级,而linux下是纳秒级     cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC         << 's' << endl;  //  fclose(stdout);}
运行结果:

time.txt中

---the end---

elapsed time:5.171s

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

#include <iostream>#include <ctime>//#include <boost/timer.hpp>//using namespace boost;using namespace std;int main(){unsigned long data;//timer t;int len = 0;freopen("data.txt","r",stdin);    while(cin >> data){      if(data >= 1000 && data <=10000000)      {      //cout << data << endl;     len++;       }    }    cout << len << endl;     // cout << t.elapsed() << endl;}


运行结果为10000000

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

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

原创粉丝点击