在 C++ 中使用分布

Using distributions in c++

我想使用内置分发,但要对其添加一些限制。我试过这样的事情,但我在使用函数时得到了相同的数字。我怎样才能避免这种情况?我可以使用分布作为函数的参数吗?

double Cauchy(double Fm){
    std::default_random_engine generator;
    std::cauchy_distribution<double> distribution(Fm, 0.1);
    double number=distribution(generator);
    while(number<0)
        number=distribution(generator);
    if (number>1)
        number = 1;
    return number;
}

现在我改变了功能,它看起来像这样

double Cauchy_1(double Fm, std::random_device &rd){

    std::default_random_engine generator(rd());
    std::cauchy_distribution<double> distribution(Fm, 0.1);
    double number=distribution(generator);
    while(number<0)
        number=distribution(generator);
    if (number>1)
        number =1;
    return number;
}


std::random_device rd;
    int i=15;
    double Crm=0.1, num;
    while (i>0){
        num=Cauchy_1(0.1, rd);
        cout<<num<<endl;
        i--;
    }

它给了我不同的值,但新 运行 上的值是相同的。

您使用相同的默认种子初始化 std::default_random_engine generator;。如果你重新实例化它,你需要播种它以获得不同的输出。 std::random_device class 可以用来获取新的随机种子。

此外,std::default_random_engine 速度慢 class 到 instantiate/create 所以你用错了。

标准库中的函数,如 std::shuffle 通过转发引用而不是分发获取随机数生成器。你也可以这样做:

template<class URBG>
double cauchy_1(double fm, URBG&& gen) {
    std::cauchy_distribution<double> distribution(fm, 0.1);
    double number;
    do 
        number = distribution(gen);
    while (number < 0);
    return std::min(number, 1.0);
}

int main() {
    std::random_device rd;
    std::default_random_engine gen(rd());

    for (int i = 0; i < 10; ++i) {
        auto num = cauchy_1(0.1, gen);
        std::cout << num << std::endl;
    }
}

It still has same set of numbers if i rerun this code.

这不是这段代码的问题,而是std::random_device的问题。正如所解释的 here, std::random_device may be implemented in terms of a pseudo-random number engine. Possible solutions can be found here.

:

std::default_random_engine gen(
    std::chrono::system_clock::now().time_since_epoch().count());