灵活使用数组,高效生成随机数

以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当笔记,当然也希望能帮助到你,首先感谢你的阅读~!
  我们在学习和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>的老师一起来探讨一个高效生成随机数的问题吧!
我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!
更多知识请参阅广州达内

广州达内,www.gztarena.com www.gdtarena.com www.s-tarena.com
原文地址:https://www.cnblogs.com/javaitpx/p/2986143.html