C++&书信电报;随机>;一行生成 C++。
在C++中,我使用以下函数生成随机数:C++&书信电报;随机>;一行生成 C++。,c++,random,C++,Random,在C++中,我使用以下函数生成随机数: double randDouble() { std::random_device rd; std::mt19937 mt(rd()); std::uniform_real_distribution<double> dist(1.0, 10.0); return dist(mt); } double和double(){ std::随机_装置rd; 标准:mt19937 mt(rd()); 标准:均匀实分布区(1.
double randDouble() {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);
return dist(mt);
}
double和double(){
std::随机_装置rd;
标准:mt19937 mt(rd());
标准:均匀实分布区(1.0,10.0);
返回区(mt);
}
我想知道为什么我不能在一行(使用临时对象)中这样做:
double和double2(){
返回std::统一实分布{1.0,10.0}(std::默认随机引擎(std::随机设备{}());
}
我想我在某个地方读到过,这与默认构造函数对于这些类不是显式的有关,但我不确定要搜索什么来确定我是否正确
我还读到,这将是一种糟糕的做法,因为为每个调用创建一个新的
随机_设备
将非常昂贵,然而,我感兴趣的是为什么一行程序不可能,而不是不实用——也就是说,我感兴趣的是创建匿名对象的一般情况(不确定这是否是正确的术语)。如果您要为每个数字重新植入Mersenne捻线器,您不妨完全跳过它,直接从std::random\u设备生成。您可能希望mt
是静态的
或线程本地的
。生成器(std::mt19937
)必须是static
(为每个新数字创建一个新的生成器毫无意义)。您可以将其构造缩短为static std::mt19937 mt(std::random_device{}())
。您也可以将分发设置为静态的。除此之外,您可以做的事情不多。除此之外,您的种子设定是次优的。请参阅例如我的问题以获得更彻底的尝试。不可能的原因是std::uniform\u real\u distribution
的运算符()
通过非常量左值引用获取生成器。这意味着它无法绑定到您创建的临时PRNG。原因除了效率可能非常低之外,idk。谢谢大家。我现在意识到每次生成随机设备时都会出错。@BaummitAugen感谢链接-我在继续讨论时会记住这一点“适当”项目。
double randDouble2() {
return std::uniform_real_distribution<double>{1.0, 10.0}(std::default_random_engine(std::random_device{}()));
}