现在的位置: 首页 > 综合 > 正文

生成互不相同随机数的一种算法

2016年10月16日 ⁄ 综合 ⁄ 共 1731字 ⁄ 字号 评论关闭

C++中常用rand()和srand()函数相结合来生成每次执行都不相同的一组随机数,常见的写法如下:

  1. #include <iostream>  
  2. #include <cstdlib>  
  3. #include <tchar.h>  
  4. #include <ctime>  
  5.   
  6. using namespace std;  
  7.   
  8. int _tmain(int argc,_TCHAR* argv[])  
  9. {  
  10.     int randomSum=5,randomLimit=10;  
  11.     int random=0;  
  12.     srand(static_cast<unsigned int>(time(NULL)));  
  13.     for(int i=0;i<randomSum;i++)  
  14.     {  
  15.         random=rand()%randomLimit;  
  16.         cout<<random<<"\t";  
  17.     }  
  18.     cout<<endl;  
  19.     system("PAUSE");  
  20.     return 0;  
  21. }  

这个程序是随机产生5个0~9(包括0和9)之间的随机数。每次执行程序,产生的是不同的。比如某两次的执行结果如下:


从结果中可以看出产生的随机数中有重复的。

当然如果实验的次数足够大时,每个数产生的概率肯定是差不多的。但具体大每一次中不免有重复的数字,怎么才能产生一组互不相等的随机数呢?

有很多种方法,这里介绍一种实现,具体如下:

一、动态生成一个数组,其长度是要产生随机数的上界,每个元素的值为其对应的下标。

二、随机生成该范围内的一个数,以该数为数组下标,取出对应的数组中的元素(其实数组中的元素和该随机数一样),取出后,将下标对应的数组元素赋值为-1(赋值-1是因为随机数中或许有0),来作为下次判断的依据。

三、再产生该范围内的随机数,如果对应的数组下标中的元素是-1,就再生成,直到不是-1为止。

四、重复步骤二、三,直到产生够所需的随机数个数。

注意点:随机数个数应小于等于随机数的范围

具体的代码如下:

  1. void RandomNumbers(int limit,int sum)  
  2. {  
  3.     fstream file("data.txt",ios::out);  
  4.     int count=0,number=0;  
  5.     int *temp=new int[limit];  
  6.     for(int i=0;i<limit;i++)  
  7.     {  
  8.         temp[i]=i;  
  9.     }  
  10.   
  11.     srand(static_cast<unsigned int>(time(NULL)));  
  12.     for(int i=1;i<=sum;i++)  
  13.     {  
  14.         number=rand()%limit;  
  15.         while(temp[number]==-1)  
  16.         {  
  17.             number=rand()%limit;  
  18.         }  
  19.         file<<temp[number]<<"\t";  
  20.         count++;  
  21.         if(count%10==0)  
  22.         {  
  23.             file<<endl;  
  24.         }  
  25.         temp[number]=-1;  
  26.     }  
  27.     delete []temp;  
  28.     temp=NULL;  
  29.     file.close();  
  30.     cout<<"已产生"<<sum<<"个"<<"大于等于0少于"<<limit<<"的互不相等的随机数"<<endl;  
  31. }  

该函数实现的是产生0~limit(包括0和limit)内的sum个随机数,并存入data.txt文件中。

程序运行结果:



思考:该算法就是用空间来换时间,如果每次产生一个随机数都和前面产生的比较的话,将耗费大量的时间。

还有什么更好的,大家都说说哈O(∩_∩)O~ 

抱歉!评论已关闭.