C++随机数引擎

C++的随机数引擎有以下几个要点需要注意:

   1、随机数发生器使用同一种子会生成相同序列的随机数序列

  2、为了让程序每次运行都会生成不同的随机结果,我们可以使用 time(0) 产生一个随机数种子

  3、我们必须传递引擎本身给分布对象,因为有些分布可能需要调用引擎多次才能得出结果

以下是几种随机分布:

  1、均匀分布:(1) 产生随机整数:uniform_int_distribution<[type]> u[(range)]

           (2) 产生随机小数:uniform_real_distribution<[type]> u[(range)]

   2正态分布:normal_distribution<[type]> n(E, D)

   3伯努利分布:bernoulli_distribution b[(概率)],返回 bool 值,且返回 true 的概率为常数,默认为 0.5 

注:这些随机分布都包含在头文件 random 里面

#include <iostream>
#include <cstdlib> 
#include <ctime>
#include <cmath>
#include <random>
#include <vector>

using namespace std;

int main()
{
    static default_random_engine e;
//    返回该引擎能生成的最小及最大值 
    cout<<"Min: "<<e.min()<<ends<<"Max: "<<e.max()<<endl;
    
//    time 返回以秒计的时间 
    e.seed(time(0));
    
    static uniform_int_distribution<unsigned> u(0, 9);
    cout<<"生成[0,9]的3个随机整数为:"; 
    for (size_t i = 0; i < 3; ++i)
        cout<<u(e)<<ends;
    cout<<endl;
    
    /*
        u.min() 和 u.max() 返回 u(e) 能生成的最小和最大值
        u.reset() 重建 u 的状态,使随后对 u 的使用不依赖于 u 已经生成的值 
    */
        
    static uniform_real_distribution<double> r(0, 1);
    cout<<"生成[0, 1]的3个随机小数为:";
    for (size_t i = 0; i < 3; ++i)
        cout<<r(e)<<ends;
    cout<<endl;
    
    static normal_distribution<> n(4, 1.5);
    cout<<"正态分布个数统计"<<endl;
    vector<unsigned> vals(9);
    for (size_t i = 0; i != 100; ++i){
//        cmath 的 lround 函数把值舍入到最接近的整数 
        unsigned v = lround(n(e));
        if (v < vals.size())
            ++vals[v];
    }
    for (size_t i = 0; i < vals.size(); ++i)
        cout<<i<<":	"<<vals[i]<<endl;
        
//     返回 true 的概率为 0 
    static bernoulli_distribution b(0);
    for (size_t i = 0; i < 3; ++i)
        cout<<boolalpha<<b(e)<<noboolalpha<<ends;
    cout<<endl;
    
    system("pause");
        
    return 0;
}
原文地址:https://www.cnblogs.com/lemonyam/p/10631347.html