首頁 >後端開發 >C++ >為什麼在 C 函數中重複使用'srand()”會導致非隨機結果?

為什麼在 C 函數中重複使用'srand()”會導致非隨機結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-30 08:49:09272瀏覽

Why Does Repeatedly Using `srand()` in a C   Function Lead to Non-Random Results?

使用rand() 在函數內產生真正的隨機值

在C 中,使用rand() 在單一函數內產生隨機數函數可以產生重複值。當每次呼叫 rand() 之前重複呼叫 srand() 時,就會出現此問題。

問題:

考慮您提供的範例:

string PullOne()
{
    string pick;
    string choices[3] = {"BAR", "7", "cherries"};

    std::srand(time(0));
    pick = choices[(std::rand() % 3)];
    return pick;
}

從main() 多次呼叫PullOne() 時,您期望pull_1 有不同的隨機值,拉_2 和拉_3。但是,您始終獲得相同的結果。

解決方案:

要解決此問題,請將srand() 的呼叫移到PullOne() 函數之外並放置在程式開始時就執行一次。透過這樣做,您可以初始化隨機數產生器一次,確保為後續的 rand() 呼叫產生真正的隨機序列。

// srand() is now called only once, at program initialization.
int main()
{
    std::srand(time(0));

    string pull_1, pull_2, pull_3;
    pull_1 = PullOne();
    pull_2 = PullOne();
    pull_3 = PullOne();

    return 0;
}

解釋:

srand () 設定隨機數產生器的種子。當重複使用相同的種子時,生成器會產生相同的序列。透過初始化 srand() 一次,種子在整個程式中保持一致,從而導致 rand() 的可預測且非隨機的輸出。

因此,僅呼叫 srand() 一次至關重要,最好是在程式期間初始化或隨機數產生過程開始時。這確保了您的函數內產生真正的隨機數。

以上是為什麼在 C 函數中重複使用'srand()”會導致非隨機結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn