【问题标题】:How to generate lognormal distributed random variable using c++ boost library如何使用 c++ boost 库生成对数正态分布随机变量
【发布时间】:2021-04-26 15:01:43
【问题描述】:

我正在尝试根据不同的分布生成不同的随机数,以对它们进行一些实验。我选择了 c++ 中的 boost 库,因为我看到里面有大量的函数。例如,在对数正态分布中,我关注了这个页面https://www.boost.org/doc/libs/1_43_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref/dists/lognormal_dist.html 等等。但我无法理解如何实际生成随机数。我试过了 int main(){boost::math::lognormal_distribution<> myLognormal{0,8};cout << myLognormal() << endl; return 0;} 但它除了错误什么都不做。

【问题讨论】:

  • 你需要一个随机引擎。
  • std::lognormal_distribution 有示例用法。
  • @Jarod42 随机引擎的意思。我如何在代码中使用它。你能详细说明一下吗?
  • 你真的不需要为此提升。标准 C++11 有很多发行版和示例,比如 Jarod42 链接的那个。如果你仍然想使用 boost 中的一些东西,他们的发行版库的最新文档在这里:boost.org/doc/libs/1_76_0/libs/math/doc/html/dist.html。在“工作示例”下查看一些示例程序。
  • 你可能想看看boost_random。您来自boost::math 的分布似乎不用于生成数字,而是使用分布属性。

标签: c++ boost


【解决方案1】:

您已经获得了一些有用的 cmets。让我把它结合成一个例子:

使用标准库(C++11 及更高版本)

活在 Coliru 上

#include <random>
#include <iostream>

int main() {
    std::mt19937 engine; // uniform random bit engine

    // seed the URBG
    std::random_device dev{};
    engine.seed(dev());

    // setup a distribution:
    double mu    = 1.0;
    double sigma = 1.0;
    std::lognormal_distribution<double> dist(mu, sigma);

    for (int i = 1'000; i--;) {
        std::cout << dist(engine) << "\n";
    }
}

绘制这些数字:

https://plotly.com/~sehe/27/

使用随机提升

与 Boost Random 相同:

Live On Coliru

#include <boost/random.hpp>
#include <boost/random/random_device.hpp>
#include <iostream>

int main() {
    boost::random::mt19937 engine; // uniform random bit engine

    // seed the URBG
    boost::random::random_device dev;
    engine.seed(dev); // actually without call operator is better with boost

    // setup a distribution:
    double mu    = 1.0;
    double sigma = 1.0;
    boost::random::lognormal_distribution<double> dist(mu, sigma);

    for (int i = 1'000; i--;) {
        std::cout << dist(engine) << "\n";
    }
}

注意,此时你需要链接 Boost Random 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 2018-06-22
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多