簡體   English   中英

每次在C ++中調用隨機函數

[英]Random function each time called in c++

我是C ++的新手,只用了幾個小時。

我想創建一個函數,使用一個介於1到255之間的隨機值(對於隨機IP地址)填充一個數組/向量。

我創建了這個:

vector<int> gen_ip_tuple(){

    int sh_rand;
    vector<int> vect_tuple;
    srand(time(NULL));  // initialize random seed
    for (int i = 0; i < 4; i++){
        sh_rand = rand() % 255 + 1;     // between 1 to 255
        cout << sh_rand << endl;
        vect_tuple.push_back(sh_rand);
    }   
    return vect_tuple;
}

如果被調用一次,它將很好地工作。

但是,如果我多次調用此函數,則每次都會產生相同的4元組結果。

我不明白,因為我使用srand(time(NULL))擁有隨機種子。

該種子是在函數中設置的,因此每次都必須是新的。


綜上所述:

  • 每次程序重新運行時,四元組都是隨機的(與之前的運行不同)

     first run = {67,127,115,45} second run ={157,142,16,93} 
  • 每次調用該函數時,都會產生相同的結果。

     first call = {157,142,16,93} second call ={157,142,16,93} .... 

你有什么主意嗎?

“ srand(time(NULL))具有隨機種子” <-僅在time(NULL)值更改時才提供不同的種子,這種更改僅每秒發生一次。 如果秒內調用函數4次,則會得到四個相同的結果集。

您應該將srand()設置從gen_ip_tuple ,可能移至main()函數中。 並不打算讓程序的不同部分繼續調用srand()

編輯

我更改srand(time(NULL)); srand(time(NULL)+ rand()); 它運作良好。 多謝你們。 -@ user1778354

隨着隨機性的發展,這是一種嚴重破壞的方法。 它會使rand()否則不能重復的時期無效(在流行平台上為2 ^ 32),因此time(NULL) + rand()會更早地評估已使用的srand()種子。 即使rand()和加密哈希一樣隨機-而且距離它還很遠-風險將按照“生日問題”進行,請參閱http://preshing.com/20110504/hash-collision-probabilities/-即〜 25000個通話后10%,50000個通話后50%,150000個通話后90%。

我不知道您的程序將調用gen_ip_tuple多少次,或者您有多嚴重需要隨機調用它,但是您的方法沒有好處,也沒有嚴重的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM