У меня есть следующий код для выборки из бета-версии
#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. Интересно, что пошло не так с моей реализацией.
Ну и дела, мне интересно, почему это может работать очень быстро, если заданы простые значения (1, 1), и не так быстро, когда вы даете ему гораздо большие значения (23, 171)... Может быть, это похоже на то, почему вы можете легко переместить две гири по одному фунту (по одной в каждую руку), в то время как переместить 23 фунта и 171 фунт потребовало бы гораздо больше усилий (что, очевидно, потребовало бы значительно больших усилий)?
Извините, мне следовало быть более ясным. Что меня смущает, так это то, что если программа работает слишком медленно или есть какая-то другая проблема (бесконечный цикл и т. д.), программа никогда не заканчивается.
Почему вы используете детали реализации, такие как пространство имен __gnu_cxx
? Используйте документированные бета-дистрибутивы: GNU — бета-дистрибутив
Реализация 🔁 __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
являются просто недопустимыми значениями и приводят к неопределенному поведению. Я бы рекомендовал не использовать этот класс, если вы не найдете документацию по его спецификации.
Спасибо за ответ! Существует ли защитный подход, который может предотвратить возникновение подобных бесконечных циклов? Предположительно, мы можем сделать тайм-аут, но это не приведет к завершению бесконечного цикла.
@Адам, лучший способ сделать это - использовать только тот код, который вы понимаете, и иметь спецификации для него.
Я, конечно, не эксперт, но считали ли вы, что вычисление функции с учетом параметров 23 и 171 очень затратно?