C++笔记-随机数

  1. 随机数依赖于一个简单的rand函数来生成随机数。每个随机数的范围在0~32767之间。C++程序不应该使用库函数rand,而应该使用default_random_engine类和恰当的分布类对象。
  2. 随机数引擎和分布
引擎        类型,生成随机unsigned整数序列
分布        类型,使用引擎返回服从特定概率分布的随机数

可以通过调用引擎来生成一个原始随机数
default_random_engine e;
for(size_t i = 0; i < 10; ++i)
    cout << e() << endl;
随机数引擎的一些操作
Engine e;               默认构造函数,使用该引擎类型的默认种子
Engine e(s);            使用整型值s作为种子
e.seed(s);              使用s重置引擎的状态
e.min()                 此引擎可生成的最小和最大值
e.max()
Engine::result_type     此引擎生成的unsigned整型类型
e.discard(u)            将引擎推进u步,u的类型为unsigned long long
为了得到一个指定范围的数,我们必须指出分布,来控制引擎的生成
//生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution<unsigned> u(0,9);
default_random_engine e;    //生成无符号随机数
for(size_t i = 0; i < 10; ++i)
{
    //将u作为随机数源
    //每个调用返回在指定范围内并服从均匀分布
    cout << u(e) << endl;
}

#Note#
    我们所说的随机数发生器,指分布对象和引擎对象的组合。
  1. 比较随机数引擎和rand函数,随机数引擎生成的unsigned整数在一个系统定义的范围内,而rand生成的数在0到RAND_MAX之间。一个引擎类型的范围可以通过调用该对象的min和max来获得。
  2. 当使用引擎生成一个数值序列时,一个给定的随机数发生器会一直生成相同的随机数序列,一个函数如果定义了局部的随机数发生器,应该将其(包含引擎和分布对象)定义为static的。否则每次调用函数都会产生相同的序列。
//以下随机数引擎将产生相同的随机数序列
vector<unsigned> bad_randVec()
{
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0,9);
    vector<unsigned> ret;
    for(size_t t = 0; t < 100; ++t)
        ret.push_back(u(e));
    return ret;
}

//通过将引擎和分布对象定义为static,使得它们在函数调用之前会保持住状态
vector<unsigned> good_randVec()
{
    static default_random_engine e;
    static uniform_int_distribution<unsigned> u(0,9);
    vector<unsigned> ret;
    for(size_t t = 0; t < 100; ++t)
    {
        ret.push_back(u(e));
    }
    return ret;
}

由于引擎返回相同的随机数队列,所以我们必须在循坏外声明引擎对象。
否则,每步循环都会创建一个新的引擎,但是产生相同的随机数。
类似,分布对象也要保持状态,因此也要定义在循环外。
  1. 如果程序作为一个自动过程的一部分反复运行,将time的返回值作为种子的方式就无效了,因为可能一秒内有多次程序运行
  2. normal_distribution与bernoulli_distribution类
normal_distribution 正态分布
normal_distribution<> n(4, 1.5)    //均值为4,标准差为1.5

bernoulli_distribution  该分布总是返回一个bool值,同时返回true的概率为0.5
                        也可以通过初始化改写返回true的概率
bernoulli_distribution b;   //默认是50 / 50的概率
bernoulli_distribution b(0.55); //此时,返回true的概率为0.55,返回false概率为0.45
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值