2016-07-18 10 views
0

私は最近、C++の学習を開始したばかりなので、プログラムのデバッグに問題があります。random_device、mt19937、uniform_int_distributionを使用しようとすると、多くのコンパイルエラーが発生する

乱数を生成したい。

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); 
        ^

私はいくつかの研究をした:いくつかのグーグルた後、私がg++ -std=c++14 test.cppで、私はこれらのエラーを取得することをコンパイルするときに、それを行うための一つの方法は、しかし

#include <random> 

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

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

の線に沿って何かであることが表示されますrandom_devicemt19937uniform_int_distributionになりました。私の知る限りでは、すべてを正しく使用しているようです。私は基本的に他の答えからコードをコピーしていますので、コードはうまくいくはずです。コードのコンテキストを変更すると何かが壊れましたか?

+0

あなたはいくつかのことを宣言し、後でそれらを呼び出すことを試みています。コンストラクタを使用する場合は、宣言されている場所でコンストラクタを使用します。 'std :: mt19937 rng(std :: random_device());' – Ryan

+0

あなたは 'rng(std :: random_device()());'で何をしようとしていますか?コンストラクタを呼び出しますか?これは 'main'が動作する前に既に発生しています...あなたは' rng'オブジェクトを宣言しているのと同じ場所でデストラクタを呼び出す必要があります。 – Cornstalks

+0

'rng.seed(std :: random_device()());'および 'distribution.param(std :: uniform_int_distribution :: param_type(0,10));' – WhozCraig

答えて

2

デバイス、ジェネレータ、およびディストリビューションのコンセプトが混在しています。すべてのものを別々に保つようにしてください。それは簡単になります。

#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'; 
} 
関連する問題