尝试使用 random_device、mt19937 和uniform_int_distribution 时出现大量编译器错误

The*_*Hat 2 c++ random

我最近才开始学习 C++,所以我在调试程序时遇到了麻烦。

\n\n

我想生成随机数。经过一番谷歌搜索后,似乎做到这一点的一种方法是沿着以下路线

\n\n
#include <random>\n\nstd::mt19937 rng;\nstd::uniform_int_distribution<int> distribution;\n\nint main()\n{\n    rng(std::random_device()());\n    distribution(0, 10);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我用它编译时g++ -std=c++14 test.cpp,我收到以下错误:

\n\n
test.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:8:31: error: no match for call to \xe2\x80\x98(std::mt19937 {aka std::mersenne_twister_engine<unsigned int, 32u, 624u, 397u, 31u, 2567483615u, 11u, 4294967295u, 7u, 2636928640u, 15u, 4022730752u, 18u, 1812433253u>}) (std::random_device::result_type)\xe2\x80\x99\n     rng(std::random_device()());\n                               ^\nIn file included from /usr/include/c++/5/random:49:0,\n                 from test.cpp:1:\n/usr/include/c++/5/bits/random.h:546:7: note: candidate: std::mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type std::mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::operator()() [with _UIntType = unsigned int; unsigned int __w = 32u; unsigned int __n = 624u; unsigned int __m = 397u; unsigned int __r = 31u; _UIntType __a = 2567483615u; unsigned int __u = 11u; _UIntType __d = 4294967295u; unsigned int __s = 7u; _UIntType __b = 2636928640u; unsigned int __t = 15u; _UIntType __c = 4022730752u; unsigned int __l = 18u; _UIntType __f = 1812433253u; std::mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type = unsigned int]\n       operator()();\n       ^\n/usr/include/c++/5/bits/random.h:546:7: note:   candidate expects 0 arguments, 1 provided\ntest.cpp:9:23: error: no match for call to \xe2\x80\x98(std::uniform_int_distribution<int>) (int, int)\xe2\x80\x99\n     distribution(0, 10);\n                       ^\nIn file included from /usr/include/c++/5/random:49:0,\n                 from test.cpp:1:\n/usr/include/c++/5/bits/random.h:1768:2: note: candidate: template<class _UniformRandomNumberGenerator> std::uniform_int_distribution<_IntType>::result_type std::uniform_int_distribution<_IntType>::operator()(_UniformRandomNumberGenerator&) [with _UniformRandomNumberGenerator = _UniformRandomNumberGenerator; _IntType = int]\n  operator()(_UniformRandomNumberGenerator& __urng)\n  ^\n/usr/include/c++/5/bits/random.h:1768:2: note:   template argument deduction/substitution failed:\ntest.cpp:9:23: note:   candidate expects 1 argument, 2 provided\n     distribution(0, 10);\n                       ^\nIn file included from /usr/include/c++/5/random:49:0,\n                 from test.cpp:1:\n/usr/include/c++/5/bits/random.h:1773:2: note: candidate: template<class _UniformRandomNumberGenerator> std::uniform_int_distribution<_IntType>::result_type std::uniform_int_distribution<_IntType>::operator()(_UniformRandomNumberGenerator&, const std::uniform_int_distribution<_IntType>::param_type&) [with _UniformRandomNumberGenerator = _UniformRandomNumberGenerator; _IntType = int]\n  operator()(_UniformRandomNumberGenerator& __urng,\n  ^\n/usr/include/c++/5/bits/random.h:1773:2: note:   template argument deduction/substitution failed:\ntest.cpp:9:23: note:   cannot convert \xe2\x80\x9810\xe2\x80\x99 (type \xe2\x80\x98int\xe2\x80\x99) to type \xe2\x80\x98const std::uniform_int_distribution<int>::param_type&\xe2\x80\x99\n     distribution(0, 10);\n                       ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

我做了一些研究random_device, mt19937, 和uniform_int_distribution做了一些研究,以我有限的知识看来,我使用的一切都是正确的。我基本上还从其他答案中复制粘贴了代码,所以看起来代码应该可以工作。更改代码的上下文是否会破坏某些内容?

\n

Man*_*lva 5

您混淆了设备、生成器和分配的概念。尽量将每件事分开;那么它就会变得简单。

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 200);
    for (int n = 0; n < 10; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)