Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Tutorial

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 30. Boost.Random

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Источник этого примера см.die.cpp. В первую очередь, мы должны включить заголовки<mt19937>и<uniform_int_distribution>.

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

Мы используем<mt19937>в качестве источника случайности. Цифры будут одинаковыми при каждом запуске программы. Одним из распространенных способов изменения этого является семя с текущим временем (<std::time(0)>определено в ctime).

boost::random::mt19937 gen;

[Note]Note

Мы используем здесьглобальныйгенераторный объект. Это важно, потому что мы не хотим создавать новыйгенератор псевдослучайных чиселпри каждом вызове.

Теперь мы можем определить функцию, которая имитирует обычную шестигранную смерть.

int roll_die() {
    1boost::random::uniform_int_distribution<> dist(1, 6);
    2return dist(gen);
}

1

<mt19937>производит целые числа в диапазоне [0, 232-1. Но нам нужны цифры в диапазоне [1, 6]. Распределение<uniform_int_distribution>осуществляет это преобразование.

[Warning]Warning

Вопреки распространенному использованию C++<uniform_int_distribution>не принимаетполуоткрытый диапазон. Вместо этого он занимаетзамкнутый диапазон. Учитывая параметры 1 и 6,<uniform_int_distribution>может производить любое из значений 1, 2, 3, 4, 5 или 6.

2

Распределение — это объект функции. Мы генерируем случайное число, звоня<dist>с генератором.

Источник этого примера см.weighted_die.cpp.

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/discrete_distribution.hpp>
boost::mt19937 gen;

На этот раз вместо справедливой смерти вероятность прокатки 1 равна 50% (!). Остальные пять лиц одинаково вероятны.

<discrete_distribution>Здесь хорошо работает, позволяя нам придавать вес каждому из возможных результатов.

[Tip]Tip

Если ваш компилятор поддерживает<std::initializer_list>, вы можете инициализировать<discrete_distribution>непосредственно с весами.

double probabilities[] = {
    0.5, 0.1, 0.1, 0.1, 0.1, 0.1
};
boost::random::discrete_distribution<> dist(probabilities);

Теперь определим функцию, которая имитирует перекатывание этой матрицы.

int roll_weighted_die() {
    1return dist(gen) + 1;
}

1

Добавить 1, чтобы убедиться, что результат находится в диапазоне [1,6] вместо [0,5].

Источник этого примера см.password.cpp.

Этот пример демонстрирует генерацию случайного 8 символьного пароля.

#include <boost/random/random_device.hpp>
#include <boost/random/uniform_int_distribution.hpp>
int main() {
    1std::string chars(
        "abcdefghijklmnopqrstuvwxyz"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "1234567890"
        "!@#$%^&*()"
        "`~-_=+[{]}\\|;:'\",<.>/? ");
    2boost::random::random_device rng;
    3boost::random::uniform_int_distribution<> index_dist(0, chars.size() - 1);
    for(int i = 0; i < 8; ++i) {
        std::cout << chars[index_dist(rng)];
    }
    std::cout << std::endl;
}

1

Сначала мы определим персонажей, которых позволим. Это в значительной степени просто персонажи на стандартной клавиатуре.

2

Мы используем<random_device>как источник энтропии, поскольку хотим пароли, которые не предсказуемы.

3

Наконец, мы выбираем 8 случайных символов из строки и печатаем их на кут.


PrevUpHomeNext

Статья Tutorial раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 30. Boost.Random может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 30. Boost.Random ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:56:22/0.009376049041748/1