C++ 使用<;随机>;在C++;

C++ 使用<;随机>;在C++;,c++,random,C++,Random,提前感谢您的阅读。我对C++完全陌生(虽然不是一般的编程),但并不太了解。我正在处理的问题需要大量高质量的随机数,而默认的rand()函数是不够的。我尝试使用“随机”库,但无法使其工作。下面是简单的代码: #include "stdafx.h" #include <stdlib.h> #include <iostream> #include <random> using namespace std; int _tmain(int argc, _TCHAR*

提前感谢您的阅读。我对C++完全陌生(虽然不是一般的编程),但并不太了解。我正在处理的问题需要大量高质量的随机数,而默认的rand()函数是不够的。我尝试使用“随机”库,但无法使其工作。下面是简单的代码:

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <random>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    mt19937 gen(random_device());
    normal_distribution<double> randn(0.0, 1.0);
    double t;
    for (int i = 0; i < 50; i++){
        t = randn(gen); //program compiles correctly if call to randn is omitted
        cout << t << "\n";
    }
    int a;
    cin >> a;

}

我尝试了其他生成器和概率分布-同样的问题。有什么想法吗?

您创建的生成器不正确。您应该创建一个
std::random_device
对象,然后像函数一样调用它,并将结果传递给
std::mt19937
构造函数:

random_device rd;
mt19937 gen(rd());

您当前的代码演示了C++中最“令人讨厌的解析”。具体而言,以下是函数声明:

mt19937 gen(random_device());
它声明了一个名为
gen
的函数,该函数返回一个
mt19937
并接受一个参数,该参数是一个返回
random\u device
且不接受任何参数的函数。如果您将其更正为变量定义,则会收到一个错误,指出您将错误的类型参数传递给
mt19937
构造函数

mt19937 gen(random_device());
这是一个所谓最烦人的解析示例。编译器实际上将其解析为一个名为
gen
的函数声明,该函数采用
random\u device()
类型的参数(即,函数采用零参数并返回
std::random\u device
)并返回
std::mt19937
。因此,首先您必须将其更改为:

mt19937 gen(random_device{}); // new C++11 uniform initialization syntax
但这仍然是错误的,因为std::mt19937的构造函数的参数应该是种子值
random_device{}
是一个对象,当您调用它的
操作符()
时,它会生成一个种子值。因此,实际正确的声明是:

mt19937 gen(random_device{}());
这:

有两个问题

首先,这是所谓的“最麻烦的解析”,被解释为函数声明(一个名为
gen
的函数,它将指向返回
随机\u设备的函数的指针作为其参数)

其次,
random\u device
是一种类型,因此
random\u device()
是该类型的对象。要从中获取随机数,需要
random\u device()()

以下内容可以解决这两个问题:

random_device dev;
mt19937 gen(dev());
或者,如果您希望设备是临时的

auto seed = random_device()();
mt19937 gen(seed);
random_device dev;
mt19937 gen(dev());
auto seed = random_device()();
mt19937 gen(seed);