生成互不相同隨機數的一種算法

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~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章