Библиотека BOOST C++: генераторы случайных чисел

Перевод: Elijah Koziev

См. статью о ГСЧ в Википедии

См. статью в Компьютерре Случайность как вычислительный ресурс

Генераторы случайных чисел применяются в различных приложениях. Библиотека случайных чисел Boost Random (для краткости Boost.Random) предоставляет множество различных генераторов и распределений для производства случайных чисел, имеющих необходимые свойства, такие как равномерное распределение.

Описание базовых концепций дано здесь. Для быстрого знакомства с библиотекой Boost.Random можно посмотреть файл random_demo.cpp в исходных текстах BOOST C++.

Чтобы показать способ работы с библиотекой Boost.Random, ниже приведен короткий листинг программы:

  boost::mt19937 rng;                 			// генерация псевдослучайных чиселлл
                                      			// см. раздел о генераторах псевдослучайных чисел
  boost::uniform_int<> six(1,6)       			// отображение случайных чисел на диапазон 1..6
                                      			// см. раздел о распределениях
  boost::variate_generator<boost::mt19937, boost::uniform_int<> >
           die(rng, six);             			// звязывание генератора и распределения
  int x = die();                      			// имитация бросания игральной кости

Организация библиотеки

Данная библиотека разделена на несколько заголовочных файлов, располагающихся в каталоге boost/random/. В дополнение к этому, для удобства можно использовать заголовочный файл boost/random.hpp, который включает все другие заголовочные файлы.

Вспомогательный интерфейсный класс variate_generateм. хидер boost/random/variate_generator.hpp) обеспечивает удобный механизм создания генераторов с аналитически задаваемыми распределениями (см. документацию).

Несколько генераторов случайных чисел объявлены в следующих заголовочных файлах (за подробностями обращайтесь к документации):

Кроме этого, несколько распределений (см. подробную документацию) доступно в следующих заголовочных файлах:

В дополнение к этому, стохастический генератор истинных случайных чисел объявлен в хидере boost/nondet_random.hpp.

Для имитации некоторых других интерфейсов доступа к генераторам случайных чисел и распределений в библиотеке Boost.Random объявлены вспомогательные средства - декораторы.

Тесты

В файле random_test.cpp можно найти широкий набор тестов для генераторов псевдослучайных чисел и распределений.

Можно ознакомиться с некоторыми результатами исследования эффективности генераторов и распределений (см. файл random_speed.cpp).

Rationale

Способы получения псевдослучайных и истинно случайных чисел принципиально различны. Более того, из-за присущего современным компьютерам детерминированного характера выполнения вычислений, часто очень трудно реализовать недетерминистский алгоритм генерации случайных чисел. По этой причине библиотека для генерации случайных чисел разделена на несколько заголовочных файлов, что отражает два различных подхода к получению случайных чисел.

История библиотеки и выражения признательности

В ноябре 1999 года Джит Сукумаран (Jeet Sukumaran) предложил основанную на виртуальных функциях библиотеку, а затем сделал прототип с использованием шаблонов. Эд Брей (Ed Brey) показал, что Microsoft Visual C++ не поддерживает инициализацию членов класса внутри объявления класса, и предложил использовать enum для обхода этого ограничения. Дэйв Эбрахамс (Dave Abrahams) заострил внимание на вопросах дискретности (quantization).

Первый публичный релиз библиотеки случайных чисел датируется мартом 2000 года, после широкого обсуждения в почтовой рассылке boost. огромное спасибо следует выразить Биману Доуису (Beman Dawes) за предложенный им класс min_rand, исправления ошибок с непортабельность кода, предложения по документированию, и за общее руководство. ГэрриЭрвин (Harry Erwin) прислал заголовочный файл с дополнительными требованиями (смысл оригинального текста тут мне не совсем ясен - прим. E.K.). Эд Брей и Биман Доуис предложили реализовать интерфейс, функционально аналогичный итераторам STL.

Биман Доуис занимался вопросами пересмотра библиотеки, на продолжении которого Мэтиэс Тройер (Matthias Troyer), Цаба Шепесвари (Csaba Szepesvari), и Томэс Холенштайн (Thomas Holenstein) предлагали свои детальные комментарии. переработанная версия стала официальной частью BOOST C++ 17 июня 2000 года.

Гэри Пауэл (Gary Powell) предложил некоторые чистки исходного кода. Дэйв Эбрахамс и Ховард Хинант (Howard Hinnant) предложит перенести объявления шаблонов базовых генераторов из пространства имен boost::detail в boost::random.

Эд Брэй выразал желание убрать некоторые избыточные предупреждения компилятора и помог с манипуляциями с uint64_t. Андреас Шэрер (Andreas Scherer) делал тесты с MSVC. Мэтиас Тройер сделал вклад в виде генератора случайных чисел Фибоначчи с задержкой (lagged Fibonacci generator). Майкл Стивенс (Michael Stevens) обнаружил ошибку при копировании нормального распределения и предложил улучшения в документации.

Jens Maurer, 2001-08-31

Последняя правка: 16.06.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010