Как использовать Boost Random

Мне нужно сгенерировать случайное число с Boost Random.

Я пытался следовать общему руководству.

Я извлек файлы библиотеки. Так что, если я хочу использовать классы и objectj библиотеки, как я должен делать?

Сначала я знаю, включая библиотеку в программе. Тогда я должен скомпилировать библиотеку и сам program.cpp? (И оба с одним и тем же компилятором — я использую g ++).

Я использую виртуальную коробку Ubuntu. Это первый раз, когда я использую библиотеку, поэтому я действительно не знаю.

-1

Решение

случайное число для моего случая должно быть двойным, а не просто целым числом …

Итак, вы используете распределение реальных чисел.


Я не такой, чтобы «начать» лучше всего подходит для StackOverflow, но я дам вам несколько быстрых советов:

В вашей виртуальной коробке Ubuntu:

sudo apt-get install libboost-all-dev
mkdir -pv ~/myproject
cd ~/myproject

Создайте файл, используя ваш любимый редактор. Если у вас их нет, gedit main.cpp или же nano main.cpp это начало:

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

int main() {
boost::random::mt19937 rng;
boost::random::uniform_real_distribution<double> gen(0.0, 1.0);
for (int i = 0; i < 10; ++i) {
std::cout << gen(rng) << "\n";
}
}

Теперь скомпилируйте его, используя

g++ -O2 -Wall -Wextra -pedantic main.cpp -o demo

Программа готова к запуску: Жить на Колиру

./demo

печать

0.814724
0.135477
0.905792
0.835009
0.126987
0.968868
0.913376
0.221034
0.632359
0.308167

засеивание && Библиотеки без заголовка

Вышесказанное работает, потому что библиотека Boost Random имеет в основном только заголовок. Что делать, если вы хотите использовать random_device реализация для запуска генератора случайных чисел?

Жить на Колиру

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

int main() {
boost::random::random_device seeder;
boost::random::mt19937 rng(seeder());
boost::random::uniform_real_distribution<double> gen(0.0, 1.0);
for (int i = 0; i < 10; ++i) {
std::cout << gen(rng) << "\n";
}
}

Теперь вам также нужно сделать ссылку:

g++ -O2 -Wall -Wextra -pedantic main.cpp -o demo -lboost_random

Теперь вывод будет отличаться при каждом запуске.

БОНУС: Стандартная библиотека вместо Boost

Вам не нужно Boost здесь вообще:

Жить на Колиру

#include <random>
#include <iostream>

int main() {
std::random_device seeder;
std::mt19937 rng(seeder());
std::uniform_real_distribution<double> gen(0.0, 1.0);
for (int i = 0; i < 10; ++i) {
std::cout << gen(rng) << "\n";
}
}

Компилировать с

g++ -std=c++11 -O2 -Wall -Wextra -pedantic main.cpp -o demo

И запустить его снова с ./demo

БОНУС

Отображение всей гаммы распределений, которые имеют среднее значение = 0 и stddev = 1:

Жить на Колиру

#include <random>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <boost/serialization/array_wrapper.hpp>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>

namespace ba = boost::accumulators;
using Accum = ba::accumulator_set<double, ba::stats<ba::tag::variance, ba::tag::mean> >;
using Clock = std::chrono::high_resolution_clock;
using namespace std::chrono_literals;

static double identity(double d) { return d; }

template <typename Prng, typename Dist, typename F = double(double), size_t N = (1ull << 22)>
void test(Prng& rng, Dist dist, F f = &identity) {
Accum accum;

auto s = Clock::now();
for (size_t i = 0; i<N; ++i)
accum(f(dist(rng)));

std::cout
<< std::setw(34) << typeid(Dist).name()
<< ":\t" << ba::mean(accum)
<< " stddev: " << sqrt(ba::variance(accum))
<< " N=" << N
<< " in " << ((Clock::now()-s)/1.s) << "s"<< std::endl;
}

int main() {
std::mt19937 rng(std::random_device{}());

auto shift = [](double shift) { return [=](double v) { return v + shift; }; };
auto scale = [](double scale) { return [=](double v) { return v * scale; }; };

std::cout << std::fixed << std::showpos;
test(rng, std::uniform_real_distribution<double>(-sqrt(3), sqrt(3)));
test(rng, std::weibull_distribution<double>(), shift(-1));
test(rng, std::exponential_distribution<double>(), shift(-1));
test(rng, std::normal_distribution<double>());
test(rng, std::lognormal_distribution<double>(0, log(0.5)), shift(-exp(pow(log(0.5),2)/2)));
test(rng, std::chi_squared_distribution<double>(0.5), shift(-0.5));
{
auto sigma = sqrt(6)/M_PI;
static constexpr double ec = 0.57721566490153286060;
test(rng, std::extreme_value_distribution<double>(-sigma*ec, sigma));
}
test(rng, std::fisher_f_distribution<double>(48, 8), shift(-(8.0/6.0)));
test(rng, std::student_t_distribution<double>(4), scale(sqrt(0.5)));
test(rng, std::student_t_distribution<double>(4), scale(sqrt(0.5)));
}

Печать

  St25uniform_real_distributionIdE: +0.000375 stddev: +1.000056 N=4194304 in +0.169681s
St20weibull_distributionIdE: +0.001030 stddev: +1.000518 N=4194304 in +0.385036s
St24exponential_distributionIdE: -0.000360 stddev: +1.000343 N=4194304 in +0.389443s
St19normal_distributionIdE: -0.000133 stddev: +1.000330 N=4194304 in +0.390235s
St22lognormal_distributionIdE: +0.000887 stddev: +1.000372 N=4194304 in +0.521975s
St24chi_squared_distributionIdE: -0.000092 stddev: +0.999695 N=4194304 in +1.233835s
St26extreme_value_distributionIdE: -0.000381 stddev: +1.000242 N=4194304 in +0.611973s
St21fisher_f_distributionIdE: -0.000073 stddev: +1.001588 N=4194304 in +1.326189s
St22student_t_distributionIdE: +0.000957 stddev: +0.998087 N=4194304 in +1.080468s
St22student_t_distributionIdE: +0.000677 stddev: +0.998786 N=4194304 in +1.079066s
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]