首页 > 解决方案 > 如何包含 uniform_real_distribution 的最大值

问题描述

我是 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 一起使用。

标签: c++c++11randomchrono

解决方案


  1. 正如 Chris Drew 所说,您可以将nextafter其用作uniform_real_distribution.
  2. 请注意,您首先实例化一个新对象chrono::steady_clock(使用chrono::steady_clock()),然后尝试now()从该对象调用静态成员。

作为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";
}

推荐阅读