c++ 用于 beta 发行版

问题描述 投票:0回答:1

我有以下代码可以从测试版本中采样

#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。我想知道我的实施出了什么问题。

c++ c++11
1个回答
0
投票

__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
始终位于
2.5
附近,而
__y
位于
1.1
附近,因此条件永远不会成立:https://godbolt.org/z/aKxoYKM1a

我找不到

__gnu_cxx::beta_distribution
的任何文档,但我想你的
alpha
beta
值只是无效值并导致未定义的行为。我建议不要使用此类,除非您可以找到其规范的文档。

© www.soinside.com 2019 - 2024. All rights reserved.