今天突發奇想,想實現一個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;
}