C++中常用rand()和srand()函數相結合來生成每次執行都不相同的一組隨機數,常見的寫法如下:
- #include <iostream>
- #include <cstdlib>
- #include <tchar.h>
- #include <ctime>
- using namespace std;
- int _tmain(int argc,_TCHAR* argv[])
- {
- int randomSum=5,randomLimit=10;
- int random=0;
- srand(static_cast<unsigned int>(time(NULL)));
- for(int i=0;i<randomSum;i++)
- {
- random=rand()%randomLimit;
- cout<<random<<"\t";
- }
- cout<<endl;
- system("PAUSE");
- return 0;
- }
從結果中可以看出產生的隨機數中有重複的。
當然如果實驗的次數足夠大時,每個數產生的概率肯定是差不多的。但具體大每一次中不免有重複的數字,怎麼才能產生一組互不相等的隨機數呢?
有很多種方法,這裏介紹一種實現,具體如下:
一、動態生成一個數組,其長度是要產生隨機數的上界,每個元素的值爲其對應的下標。
二、隨機生成該範圍內的一個數,以該數爲數組下標,取出對應的數組中的元素(其實數組中的元素和該隨機數一樣),取出後,將下標對應的數組元素賦值爲-1(賦值-1是因爲隨機數中或許有0),來作爲下次判斷的依據。
三、再產生該範圍內的隨機數,如果對應的數組下標中的元素是-1,就再生成,直到不是-1爲止。
四、重複步驟二、三,直到產生夠所需的隨機數個數。
注意點:隨機數個數應小於等於隨機數的範圍
具體的代碼如下:
- void RandomNumbers(int limit,int sum)
- {
- fstream file("data.txt",ios::out);
- int count=0,number=0;
- int *temp=new int[limit];
- for(int i=0;i<limit;i++)
- {
- temp[i]=i;
- }
- srand(static_cast<unsigned int>(time(NULL)));
- for(int i=1;i<=sum;i++)
- {
- number=rand()%limit;
- while(temp[number]==-1)
- {
- number=rand()%limit;
- }
- file<<temp[number]<<"\t";
- count++;
- if(count%10==0)
- {
- file<<endl;
- }
- temp[number]=-1;
- }
- delete []temp;
- temp=NULL;
- file.close();
- cout<<"已產生"<<sum<<"個"<<"大於等於0少於"<<limit<<"的互不相等的隨機數"<<endl;
- }
該函數實現的是產生0~limit(包括0和limit)內的sum個隨機數,並存入data.txt文件中。
程序運行結果:
思考:該算法就是用空間來換時間,如果每次產生一個隨機數都和前面產生的比較的話,將耗費大量的時間。
還有什麼更好的,大家都說說哈O(∩_∩)O~