0
点赞
收藏
分享

微信扫一扫

C++ 随机生成数 default_random_engine+uniform_int_distribution

潇湘落木life 2022-03-12 阅读 75

生成随机数对比

以前获取伪随机数都是用的rand,想要获取两个数之间的伪随机数

  • 案例:
      int min,max;
      //定义上下边界
       
      int range=max-min;
      //获取中间的范围
       
      int randNum = rand() % range + min;
      //生成介于min和max之间的伪随机数
    

目前“C++程序不应该使用库函数rand,而应使用default_random_engine类和恰当的分布类对象”。用这种新方法获取两个数之间的伪随机数的方法如下:

  • 案例:
    int min,max;
    //定义上下边界
     
    default_random_engine e;
    //创建引擎
     
    uniform_int_distribution<unsigned> u(min,max);
    //创建取值范围
     
    int randNum=u(e);
    //获取伪随机数
    

对比

  • 从代码量来说,并没有减少,但是感觉更加直观了一些,毕竟可以直接设置上下边界,不用再通过取余之类的计算了。
  • 有一个问题,就是多次调用同一对范围和引擎时,每次生成的数都是一样的。避免这个情况的话,需要在定义范围和引擎时,将其定义为static的,如下:
    static default_random_engine e;
    static uniform_int_distribution<unsigned> u(min,max);
    
  • 关于设置种子,既可以在定义时设置种子,也可以创建完成后再设置种子:
    default_random_engine e1(32767);
    //创建引擎时设置种子
    
    default_random_engine e2;
    e2.seed(32767);
    //创建后再设置种子
    
    // 如果要设置时间种子,方法如下:
    default_random_engine e(time(0));
    //设置当前时间为引擎种子
    

生成随机数相关函数

  • 随机生成数涉及的函数:default_random_engine and uniform_int_distribution
  • uniform_int_distribution
    • 离散均匀分布类,类模板定义了分布对象,它返回的是均勻分布在闭合范围 [a,b] 内的随机整&。模板参数的类型是生成的整数的类型,默认类型是 int: 定义在类中的类型别名 result_type 和分布所生成的值的类型相对应。模板类型参数只接受整数类型。
    • 生成值的类型是 int,范围从 0 到 int 类型的最大值。上边界是 int 类型的最大值,由定义在limits头文件中的函数模板 numeric_imits() 生成。获取范围的界限有很多更加简单的方式。可以调用所有分布对象都有的成员函数 min()max()
    • uniform_int_distribution 类模板定义了成员函数 a()b(),它们可以分别返回范围的下边界和上边界,与上述一致。
    • 如果只想分布的整数范围大于或等于给定值,只需要提供构造函数的第一个参数std::uniform_int_distribution<> d {20};
举报

相关推荐

0 条评论