Вопрос или проблема
Мне нужна библиотека C++, которая позволила бы динамически конструировать распределение из широкого набора семейств распределений с соответствующими параметрами на основе данных конфигурации, прочитанных с диска или из консоли (а не определяя тип распределения на этапе компиляции, то есть не просто выбор через параметры шаблона). Мне нужно иметь возможность использовать это сконструированное распределение для (относительно) эффективной генерации больших объемов данных.
Требования:
- Свобода
- Бесплатность
- Доступность для Linux и Windows
- Возможность создавать составные распределения из имеющихся (например, применение некоторой функции f: R^2->R к парам случайных величин с известными распределениями).
Желательно:
- Поддержка явно заданных распределений над малыми конечными доменами
- Поддержка распределений над комплексными числами
- Поддержка распределений над более сложными типами (варианты, кортежи, опционалы и т.д.)
- C++17, или хотя бы C++11
- Известно, что работает со многими компиляторами, включая clang, gcc и msvc
- Нет зависимостей от Boost
- Используется не только в игрушечных проектах
- Активно поддерживается
- Легко интегрируется со стандартными библиотечными распределениями
Не важно:
- Скомпилированная или заголовочная
- Псевдослучайная или использующая аппаратные источники энтропии
C++11 включает ряд статистических распределений без требования Boost:
https://en.cppreference.com/w/cpp/numeric/random
Для составления или смешивания распределений, см. этот пример:
https://stackoverflow.com/questions/37320025/mixture-of-gaussian-distribution-in-c
Это должно быть все, что вам нужно. Если нет, здесь есть библиотека только с заголовками, содержащая ряд других полезных статистических распределений:
https://github.com/kthohr/stats
Тот же автор также имеет библиотеки C++ для MCMC и оптимизации.
Ответ или решение
Если вы ищете библиотеку C++ для работы с вероятностными распределениями, которая соответствует вашим потребностям, описанным выше, то одной из задач будет найти решение, которое позволяет динамически создавать распределения из различных семейств, используя конфигурационные данные, а также эффективно генерировать большие объемы данных. Вот несколько рекомендаций и библиотек, которые могут вам подойти, исходя из ваших требований.
Основные требования и решения
Основные требования:
- Свободная и бесплатная: Библиотека должна быть с открытым исходным кодом и не требовать оплаты.
- Совместимость с Linux и Windows: Поддержка как для операционных систем Linux, так и Windows.
- Создание сложных распределений: Возможность создавать составные распределения из существующих, используя функции R² -> R для пар случайных величин.
- Поддержка C++17 или, как минимум, C++11: Передовые версии C++ обеспечат поддержку последних улучшений языка.
- Без зависимости от Boost: Некоторым проектам требуется легкость и отсутствие сложных внешних зависимостей, таких как Boost.
Рекомендации по библиотекам:
-
Стандартные распределения C++: Начните с использования встроенных в стандарт C++ распределений, представленных в
<random>
. Это минимизирует зависимости и обеспечит базовую функциональность. С подробным списком вы можете ознакомиться на документирующей странице cppreference. -
GitHub Stats Library: Гибкая библиотека от автора К. Тхоура, доступная на GitHub, которая предоставляет ряд полезных статистических распределений. Она не зависит от Boost и активно поддерживается. Ознакомьтесь с ней по этой ссылке.
Дескрипторы желаемых свойств
-
Поддержка сложных типов данных: Некоторые библиотеки могут поддерживать специализированные типы, такие как комплексные числа, варианты или кортежи. Однако, вам может понадобиться написание дополнительного кода для полной интеграции.
-
Компактность и популярность: Библиотеки, используемые в серьезных проектах, обычно сопровождаются активной поддержкой и документацией, что будет полезно для долгосрочного использования.
SEO-оптимизация и заключение
Используя комбинацию вышеупомянутых решений, вы сможете решить вашу задачу, обеспечив соответствие всех требований. Эти библиотеки предложат динамичное создание распределений и генерирование данных, оставаясь актуальными благодаря поддержке современных компиляторов, таких как clang, gcc и msvc.
В заключение, учитывая ваши требования и условия, комбинированный подход стандартных возможностей C++ и специфичных библиотек вроде Stats Library станет наиболее целесообразным решением. Следите за обновлениями и проверяйте совместимость с вашим компилятором для максимального результата.