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

來源:互聯網
上載者:User

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;}

這個程式是隨機產生5個0~9(包括0和9)之間的隨機數。每次執行程式,產生的是不同的。比如某兩次的執行結果如下:


從結果中可以看出產生的隨機數中有重複的。

當然如果實驗的次數足夠大時,每個數產生的機率肯定是差不多的。但具體大每一次中不免有重複的數字,怎麼才能產生一組互不相等的隨機數呢?

有很多種方法,這裡介紹一種實現,具體如下:

一、動態產生一個數組,其長度是要產生隨機數的上界,每個元素的值為其對應的下標。

二、隨機產生該範圍內的一個數,以該數為數組下標,取出對應的數組中的元素(其實數組中的元素和該隨機數一樣),取出後,將下標對應的數組元素賦值為-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~ 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.