Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++&书信电报;随机>;一行生成 C++。_C++_Random - Fatal编程技术网

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.

在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.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{}()));
}