灵活使用数组,高效生成随机数
以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当笔记,当然也希望能帮助到你,首先感谢你的阅读~!
我们在学习和C++ 的语法的时候,会学到数组,一般使用数组来记录一组数据,数组有下标索引,能够支持高效随机访问。
曾经去一个公司应聘的时候做过这样一道笔试题目:
如何高效生成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>的老师一起来探讨一个高效生成随机数的问题吧!
我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!
更多知识请参阅广州达内