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