zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    复(学)习化学时突然的一个 idea
    [BZOJ3032]七夕祭
    [BZOJ3781]小B的询问
    [BZOJ4103][Thu Summer Camp 2015]异或运算
    [BZOJ4817][Sdoi2017]树点涂色
    [BZOJ2506]calc
    [BZOJ1283]序列
    win 解除鼠标右键关联
    linux 常用shell命令之wc
    shell cat 合并文件,合并数据库sql文件
  • 原文地址:https://www.cnblogs.com/lemonyam/p/10631347.html
Copyright © 2011-2022 走看看