在 c++ 中使用发行版

Using distributions in c++

本文关键字:c++      更新时间:2023-10-16

我想使用内置发行版,但要添加一些约束。我尝试了这样的东西,但是在使用函数时我得到了相同的数字。我怎样才能避免这种情况?我可以使用分布作为函数的参数吗?

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类来获取新的随机种子。

此外,实例化/创建std::default_random_engine类很慢,因此您用错了。

标准库中的函数,如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;
}
}

如果我重新运行此代码,它仍然具有相同的数字集。

这不是这段代码的问题,而是std::random_device的问题。如此处所述,std::random_device可以用伪随机数引擎来实现。可以在这里找到可能的解决方案。

例如:

std::default_random_engine gen(
std::chrono::system_clock::now().time_since_epoch().count());
相关文章:
  • 没有找到相关文章