C++ 64位自定義隨機數生成器的使用 參照C++11

今天突發奇想,想實現一個64位正整數的,處理數據量在10GB級別的數據處理程序。
在生成隨機數的時候遇到了一點小障礙。

利用C庫實現

若使用 srand()/rand() 這樣的C函數的話返回的是一個int型的整數。
經過思考發現可以使用兩次rand(),分別作爲一個64bit正整數的前,後32位,實現難度也不大。

    #define RAND_SEED 64
    srand(RAND_SEED);
    int a=rand();
    int b=rand();
    cout<<hex<<a<<" "<<b<<endl;
    long long int c= ((long long int)a << 32) | b;
    cout<<hex<<c<<endl;
輸出結果:
f7 1d41
f700001d41

還有一點要注意的是,產生的數是int型,而非unsigned型,所以數字的後半部分會有問題。

下面回到主題

利用C++11的模板類 independent_bits_engine

independent_bits_engine 顧名思義:獨立的,位級別的,隨機數生成器
使用起來非常方便,這裏只是提一下如何使用,詳細的說明請參照independent_bits_engine
這個模板類有三個參數Engine,w,UIntType,分別代表所選擇的隨機數生成器,所生成隨機數的位數,生成隨機數的類型,比如說

    independent_bits_engine<default_random_engine,64,unsigned long long int> engine;

然後利用重載的()可以得到64位的隨機數

    cout<<engine()<<endl;

下面貼個使用的例子

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

int main()
{

    independent_bits_engine<default_random_engine,64,unsigned long long int> engine;
    //engine.seed(RAND_SEED);//設定隨機數種子
    //engine.discard(8);     //跳過8次,相當於執行8次engine()而不輸出結果
    //engine.max()           //獲得最大值
    //engine.min()           //獲得最小值
    for(int i=0;i<100;i++)   //獲得100個隨機數
    {
        cout<<engine()<<endl;
    }

    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章