以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当笔记,当然也希望能帮助到你,首先感谢你的阅读~!
我们在学习和 的语法的时候,会学到数组,一般使用数组来记录一组数据,数组有下标索引,能够支持高效随机访问。 曾经去一个公司应聘的时候做过这样一道笔试题目: 如何高效生成M个不同的,范围在 [0 , N) 内的随机数(M<=N)。 首先,一般情况下,我们拿到这个题目的时候,最容易想到的方法就是: 方法一: /* 1,在0~N的范围内生成一个随机数, 2,然后在0~N的范围内生成第二个随机数,判断它是否与第一个相同, 3,如果不同,存到数组中, 4,如果相同,再生成一个,继续判断, 5,重复以上操作,直到生成M个不同的随机数为止。 */ #include <iostream> using namespace std; void showNum( int randNum[], int m ) { for (int j=0; j<m; j++) { cout << randNum[j] << ' '; } cout << endl; } int main(void) { cout << "请输入0~N范围中N的大小:" << endl; int n = 0; //确定N的范围 cin >> n; cout << "请输入M的个数:" << endl; int m = 0; //确定M的个数 cin >> m; //声明一个数组用于存放M个随机数 int randNum[m]; //设定随机种子 srand(time(0)); //因为无法确定需要遍历多少次才能得到想要的随机数, //所以此处for循环的退出条件为nIndex<m,也就是得到M个不同随机数后退出循环。 for (int i=0,nIndex=0; nIndex<m; i++) { //生成一个随机数 int temp = rand()%n; //nCount是记录此次随机值与已保存数值的不同个数 int nCount=0; //如果此次生成的随机值不等于所有已保存数值, //那么nCount==nIndex,否则nCount<nIndex. for (int j=0; j<nIndex&&temp!=randNum[j]; j++) { nCount++; } if(nCount==nIndex){ randNum[nIndex]=temp; nIndex++; } } // 显示得到的随机数 showNum(randNum, m); return 0; } 我笔试的时候就是这样写的, 所以我失去了一个C/C++软件工程师 <http://www.gdtarena.com>的工作机会。 上面解决问题的思路是很清晰的,但是效率非常低,能不能生成M个不同的随机数呢?执行效率是很不稳定的,每次生成随机数所消耗的时间差异非常大,运气好的情况下,也许很快就能生成M个不相同的随机数,运气不好的话,一直都不能生成M个不相同的随机数,程序就会一直卡在那里。 我们解决问题,不能靠运气! 怎么去做这道题目呢?现在就请随广州达内岗顶中心 <http://www.gdtarena.com>的老师一起来探讨一个高效生成随机数的问题吧!我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!更多知识请参阅广州达内