Subhankar Ghosal
Subhankar Ghosal

Reputation: 175

How to generate lognormal distributed random variable using c++ boost library

I am trying to generate different random numbers following different distributions to conduct some experiments on them. I choose the boost library in c++ because I saw a large number of functions build in there. For example, in lognormal distribution, I followed this page 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 and some more. But I cannot understand how I can actually generate the random number. I tried int main(){boost::math::lognormal_distribution<> myLognormal{0,8};cout << myLognormal() << endl; return 0;} but its doing nothing but error.

Upvotes: 1

Views: 803

Answers (1)

sehe
sehe

Reputation: 393457

You have had some helpful comments already. Let me tie it together into an example:

Using Standard Library (C++11 and up)

Live On 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";
    }
}

Plotting those numbers:

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

enter image description here

Using Boost Random

Same with 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";
    }
}

Note that you need to link the Boost Random library then.

Upvotes: 1

Related Questions