尝试使用random_device,mt19937和uniform_int_distribution时有很多编译器错误

时间:2016-07-18 05:32:02

标签: c++ random

我最近刚开始学习C ++,所以我在调试程序时遇到了问题。

我想生成随机数。经过一些谷歌搜索后,似乎有一种方法可以做到这一点

#include <random>

std::mt19937 rng;
std::uniform_int_distribution<int> distribution;

int main()
{
    rng(std::random_device()());
    distribution(0, 10);
}

然而,当我用g++ -std=c++14 test.cpp编译时,我得到了这些错误:

test.cpp: In function ‘int main()’:
test.cpp:8:31: error: no match for call to ‘(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)’
     rng(std::random_device()());
                               ^
In file included from /usr/include/c++/5/random:49:0,
                 from test.cpp:1:
/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]
       operator()();
       ^
/usr/include/c++/5/bits/random.h:546:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:9:23: error: no match for call to ‘(std::uniform_int_distribution<int>) (int, int)’
     distribution(0, 10);
                       ^
In file included from /usr/include/c++/5/random:49:0,
                 from test.cpp:1:
/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]
  operator()(_UniformRandomNumberGenerator& __urng)
  ^
/usr/include/c++/5/bits/random.h:1768:2: note:   template argument deduction/substitution failed:
test.cpp:9:23: note:   candidate expects 1 argument, 2 provided
     distribution(0, 10);
                       ^
In file included from /usr/include/c++/5/random:49:0,
                 from test.cpp:1:
/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]
  operator()(_UniformRandomNumberGenerator& __urng,
  ^
/usr/include/c++/5/bits/random.h:1773:2: note:   template argument deduction/substitution failed:
test.cpp:9:23: note:   cannot convert ‘10’ (type ‘int’) to type ‘const std::uniform_int_distribution<int>::param_type&’
     distribution(0, 10);
                       ^

我对random_devicemt19937uniform_int_distribution做了一些研究,而且由于我的知识有限,我似乎正确使用了所有内容。我也基本上将其他答案的代码复制粘贴在SO上,所以看起来代码应该可行。是否更改了代码的上下文?

1 个答案:

答案 0 :(得分:2)

您正在混淆设备,发电机和分配的概念。尽量保持每件事分开;然后它会变得简单。

libmkl_intel_ilp64.a kernel32.lib