首頁  >  文章  >  後端開發  >  C++中的隨機數生成

C++中的隨機數生成

WBOY
WBOY原創
2023-08-22 12:10:516150瀏覽

C++中的隨機數生成

隨機數產生是電腦程式設計中重要的一環。在C 程式設計中,隨機數也是很常見的,可以用來模擬資料、產生測試資料、遊戲開發等面向。本文將介紹C 語言中幾種隨機數產生的方法。

偽隨機數產生

偽隨機數產生演算法是大多數程式中使用的隨機數產生方法,它並不是真正的隨機數,是透過一定的數學演算法產生的偽隨機數。在C 中,可以使用rand函數產生偽隨機數。

rand函數定義在stdlib.h頭檔中。它傳回一個int型別的隨機數,範圍在0到RAND_MAX之間,RAND_MAX定義在stdlib.h頭檔中,其值通常為32767。

範例程式碼:

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    // 设置随机数种子
    srand(time(0));
    
    // 生成10个随机数
    for(int i = 0; i < 10; i++)
    {
        cout << rand() << endl;
    }
    
    return 0;
}

在上述程式碼中,使用srand函數設定隨機數種子,time(0)可以取得目前時間的秒數,從而使每次執行程式的結果都不同。然後使用for迴圈產生10個隨機數,並輸出到螢幕上。

要注意的是,每次調用rand函數時,它會傳回一個唯一的隨機數,但如果是多次調用,之間的隨機數會存在某種程度的相關性。因此,在使用rand函數產生大量隨機數時,需要使用其他方式進行混淆處理。

真隨機數產生

真隨機數是指透過物理現象來產生的隨機數,例如可以透過硬體設備擷取地震波資料或光電特性等,但這些硬體設備都是十分昂貴的,對於絕大部分應用程式而言,使用偽隨機數產生演算法已經夠用了。

但有些需要高安全隨機數的應用場景,為了保護資料的安全性和保密性,需要使用真隨機數。在這種情況下,可以使用外部設備來提供真隨機數。例如,可以透過搖骰子、擲硬幣、抽籤等方式產生真隨機數,但這種方式不僅效率低下,且產生的隨機數種類有限。

更常見的方法是透過一個稱為隨機數產生器(RNG)的實體設備來產生真隨機數。它透過收集無法預測的物理過程或數學程式來產生隨機數,同時也能提供一些額外的安全特性。但是,使用真隨機數產生器的成本比使用偽隨機數產生演算法高得多。

C 11中的隨機數產生

C 11提供了一個新的隨機數庫,包括兩個部分:一是偽隨機數產生器,包括多個演算法可以較好地滿足各種應用場景的需求,二是真隨機數產生器,它可以存取系統特殊生成的硬體設施並返回真正的隨機數。

C 11中的隨機數產生庫包括:

  • minstd_rand0:線性同餘產生器
  • minstd_rand:改良後的線性同餘產生器
  • mt19937:Mersenne Twister 19937產生器,效能較好,運行時間較長
  • mt19937_64:Mersenne Twister 19937產生器,傳回64位元整數
  • ranlux24_base:LUX(level, uniform, eXcellent)產生器,運轉速度快,品質高
  • ranlux48_base:LUX(level, uniform, eXcellent)產生器,傳回48位元整數,運轉速度快,品質高
  • knuth_b :Knuth-B(T, P)產生器,產生不同於標準的隨機性序列,品質較高

使用C 11中的隨機數產生函式庫時,需要包含頭檔random,並且可以使用uniform_int_distribution和uniform_real_distribution函數來控制隨機數的範圍和型別。

範例程式碼:

#include <iostream>
#include <random>

using namespace std;

int main()
{
    // 以当前时间作为种子
    default_random_engine engine(time(nullptr));
    
    // uniform_int_distribution:以等概率生成min到max范围内的整数
    uniform_int_distribution<int> distribution(0, 100);
    cout << distribution(engine) << endl;
    
    // uniform_real_distribution:以等概率生成min到max范围内的浮点数
    uniform_real_distribution<double> r_distribution(0, 100);
    cout << r_distribution(engine) << endl;

    return 0;
}

上述程式碼中,使用default_random_engine來產生隨機數種子,並在uniform_int_distribution和uniform_real_distribution中分別指定了產生的整數和浮點數隨機數的範圍。最後透過呼叫engine函數來產生隨機數。

結論

以上是C 中幾種常見的隨機數產生方法,不同的應用場景需要不同的隨機數產生方法,需要根據實際情況選擇合適的方法。在實際程式設計中,可以結合偽隨機數和真隨機數的優勢,使用一些先進的隨機數來產生方法來提高程式的效率和安全性。

以上是C++中的隨機數生成的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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