今天突发奇想,想实现一个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;
}

更多推荐

C++ 64位自定义随机数生成器的使用 <random> 参照C++11