C++ для бета-распространения

У меня есть следующий код для выборки из бета-версии

#include <random>
#include <ext/random> // Include the header for __gnu_cxx::beta_distribution

int main() {
     std::cout << "Starting program..." << std::endl;

    try {
        std::random_device rd;
        std::mt19937 gen(rd());
        __gnu_cxx::beta_distribution<double> dist(23, 171); // Use __gnu_cxx::beta_distribution

        std::cout << "Generating random value..." << std::endl;
        double random_value = dist(gen); // Assign the result to a variable
        std::cout << "Random value generated: " << random_value << std::endl;

        printf("Random value: %f\n", random_value); // Print the random value
    } catch (const std::exception &e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    std::cout << "Ending program..." << std::endl;

    return 0;
}

Процесс простаивает по неизвестной мне причине https://www.programiz.com/online-compiler/0Jei4jG5u7M7f. Однако если я настрою параметр на dist(1, 1), он выведет 0,579891. Интересно, что пошло не так с моей реализацией.

Я, конечно, не эксперт, но считали ли вы, что вычисление функции с учетом параметров 23 и 171 очень затратно?

john 27.07.2024 06:53

Ну и дела, мне интересно, почему это может работать очень быстро, если заданы простые значения (1, 1), и не так быстро, когда вы даете ему гораздо большие значения (23, 171)... Может быть, это похоже на то, почему вы можете легко переместить две гири по одному фунту (по одной в каждую руку), в то время как переместить 23 фунта и 171 фунт потребовало бы гораздо больше усилий (что, очевидно, потребовало бы значительно больших усилий)?

Ken White 27.07.2024 06:58

Извините, мне следовало быть более ясным. Что меня смущает, так это то, что если программа работает слишком медленно или есть какая-то другая проблема (бесконечный цикл и т. д.), программа никогда не заканчивается.

Adam 27.07.2024 07:08

Почему вы используете детали реализации, такие как пространство имен __gnu_cxx? Используйте документированные бета-дистрибутивы: GNU — бета-дистрибутив

Ted Lyngmo 27.07.2024 07:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Реализация 🔁 __gnu_cxx::beta_distribution содержит бесконечный цикл до тех пор, пока не будут сгенерированы __x и __y, сумма которых меньше 1:

result_type __x, __y;
do {
  __x = std::exp(std::log(__aurng()) / __param.alpha());
  __y = std::exp(std::log(__aurng()) / __param.beta());
} while (__x + __y > result_type(1));

При ваших значениях alpha и beta__x и __y всегда рядом 0.9, поэтому условие никогда не бывает истинным: https://godbolt.org/z/Pshf3b9h4

Мне не удалось найти никакой документации для __gnu_cxx::beta_distribution, но я предполагаю, что ваши значения alpha и beta являются просто недопустимыми значениями и приводят к неопределенному поведению. Я бы рекомендовал не использовать этот класс, если вы не найдете документацию по его спецификации.

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

Adam 29.07.2024 19:24

@Адам, лучший способ сделать это - использовать только тот код, который вы понимаете, и иметь спецификации для него.

Alan Birtles 29.07.2024 19:52

Другие вопросы по теме

Похожие вопросы

Почему алгоритмы STL без ранжирования не ограничены концепциями C++20?
Могу ли я написать библиотеку для предварительной загрузки на C++? Есть ли что-нибудь, что мне нужно сделать, кроме добавления `extern "C"` к функциям для перехвата?
Почему clang думает, что у меня есть конструктор копирования?
Почему типы выходят из пространства имен при включении после заголовка вектора?
Инициализация вектора с помощью класса, который имеет параметр конструктора передачи по ссылке и сохраняет эту ссылку как член
Как я могу использовать VSCode с CMake и иметь разные цели, каждая из которых имеет разную архитектуру и набор инструментов?
Неточные вычисления последовательности Фибоначчи во время компиляции в рекурсивной лямбда-выражении
Синхронизируйте три потока в C++ один за другим
Явные удаленные конструкторы – имеет ли это значение?
Сопрограмма, ожидаемая в списке параметров, нарушает другой параметр?