如何包含uniform_real_distribution的最大值

时间:2018-04-30 08:12:13

标签: c++ c++11 random chrono

我是C ++的初学者,我正在尝试探索C ++ 11的功能。在这里,我试图熟悉新的随机性生成引擎。

我从这个主题的教程中总结了以下代码,我注意到两件事:

1- uniform_real_distribution不包括最大值 2-注释行产生错误,尽管它似乎在教程中正常工作。

#include <iostream>
#include <random>
#include <chrono>
#include <string>  

using namespace std;

int main(){
    unsigned seed = 201;
    //seed = chrono::steady_clock()::now().time_since_epoch().count();
    default_random_engine e(seed);
    uniform_real_distribution<double> u(0,9);
    vector<double> v(10);
    int num;
    for(int i = 0; i < 400; ++i){
        num = u(e);
        ++v[num];
    }
    for (int i = 0; i < 10; ++i)
        cout << i << ":  " << string(v[i],'*') << "\n";
}

我试图找到这两件事的原因而没有运气。

所以,我的问题:

1-如何包含最大值?
2-为什么在取消注释chrono行时出现错误?

cannot convert 'std::chrono::_V2::steady_clock' to 'unsigned int' in initialization

注意:我使用的是MinGW64 g ++和c ++ 14。

1 个答案:

答案 0 :(得分:1)

  1. 正如Chris Drew所说,您可以使用nextafter作为uniform_real_distribution的第二个参数。
  2. 请注意,您首先实例化一个新对象chrono::steady_clock(带chrono::steady_clock()),然后尝试从此对象调用静态成员now()
  3. 由于now()chrono::steady_clock的静态成员函数,您可以(并且应该)直接调用chrono::steady_clock::now()

    最终代码:

    #include <iostream>
    #include <random>
    #include <chrono>
    #include <string>  
    
    using namespace std;
    
    int main(){
        unsigned seed = 201;
        seed = chrono::steady_clock::now().time_since_epoch().count();
        default_random_engine e(seed);
        uniform_real_distribution<double> u(0,std::nextafter(9, std::numeric_limits<double>::max()));
        vector<double> v(10);
        int num;
        for(int i = 0; i < 400; ++i){
            num = u(e);
            ++v[num];
        }
        for (int i = 0; i < 10; ++i)
            cout << i << ":  " << string(v[i],'*') << "\n";
    }