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

C++学习笔记——std::uniform,第1张

  • 头文件:#include

  • 作用:随机生成一个整数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 
    #include 
    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 
    #include 
    #include 
    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维均匀分布的性质,对于一般的应用来说,足够大了,序列关联比较小,能通过很多随机性测试。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1354048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存