C++学习笔记——std::uniform_int_distribution

  • 头文件:#include <random>

  • 作用:随机生成一个整数i,根据分布概率函数 P ( i ∣ a , b ) = 1 b − a + 1 P(i|a,b)=\frac{1}{b-a+1} P(ia,b)=ba+11均匀分布在一个闭区间**[a, b]**

  • 用法:

    #include <iostream>
    #include <random>
    using namespace std;
    
    int main(int argc, char const* argv[])
    {
        random_device rd; // 用于随机数引擎获得随机种子
        std::mt19937 gen(rd()); // 以rd()为种子的标准mersenne_twister_engine
        uniform_int_distribution<int> distribute(1, 6);
        for (int i = 0; i < 10; ++i) {
            cout << distribute(gen) << " ";
        }
        cout << endl;
    }
    

    输出:

    4 5 3 6 1 4 6 4 6 6
    

    由于是伪随机算法,所以每次运行生成的随机数都是一样的

    以下使用时间函数可生成真随机数:

    #include <iostream>
    #include <random>
    #include <ctime>
    using namespace std;
    
    int main(int argc, char const* argv[])
    {
        random_device rd; // 用于随机数引擎获得随机种子
        std::mt19937 gen((unsigned int)time(NULL)); // 以(unsigned int)time(NULL)为种子的标准mersenne_twister_engine,每次都是不同的
        uniform_int_distribution<int> distribute(1, 6);
        for (int i = 0; i < 10; ++i) {
            cout << distribute(gen) << " ";
        }
        cout << endl;
    }
    
  • 注:

    • random_device:

      • std::random_device是一个均匀分布的整数随机数生成器,它产生非确定性随机数。
      • std::random_device如果非确定性源(例如硬件设备)对实现不可用,则可以根据实现定义的伪随机数引擎来实现。在这种情况下,每个std::random_device对象都可以生成相同的数字序列。
    • std::mt19937:

        typedef mersenne_twister_engine<
          uint_fast32_t,
          32, 624, 397, 31,
          0x9908b0dfUL, 11,
          0xffffffffUL, 7,
          0x9d2c5680UL, 15,
          0xefc60000UL, 18, 1812433253UL> mt19937;
      

      梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。

      Mersenne Twister有以下优点:随机性好,在计算机上容易实现,占用内存较少(mt19937的C程式码执行仅需624个字的工作区域),与其它已使用的伪随机数发生器相比,产生随机数的速度快、周期长,可达到219937-1,且具有623维均匀分布的性质,对于一般的应用来说,足够大了,序列关联比较小,能通过很多随机性测试。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值