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

b5pp 9年前發布 | 15K 次閱讀 算法 C/C++開發

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~ 

 本文由用戶 b5pp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!