2

default_random_engine プライベート フィールドを持つクラスを作成しようとしています。ただし、このクラスはコンパイルされません。私の簡単なコンソール プログラム コードは次のとおりです。

// RngTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <ctime>
#include <random>

using namespace std;

class MyClass
{
private:
    default_random_engine Rng;
public:
    MyClass(void)
        : Rng(time(NULL))
    {
    }
    ~MyClass(void)
    {
    }
    void Seed(unsigned int seed)
    {
        Rng.seed(seed);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    MyClass rng;
    rng.Seed(100);
    return 0;
}

Visual Studio 2010 (静的標準ライブラリ、MFC/ATL なし、コンソール プロジェクト) では、次のコンパイル エラーが表示されます。

c:\program files (x86)\microsoft visual studio 10.0\vc\include\random(1604): エラー C2064: 用語が 0 引数を取る関数に評価されない 1>
c:\users\vitaliy\documents\visual studio 2010 \projects\rngtest\rngtest\rngtest.cpp(25) : 関数テンプレートのインスタンス化への参照を参照してください_Cx,_Lx>::seed(_Gen &,bool)' コンパイル中

このようなコンパイルの失敗の理由は何ですか? Visual C++ 2010 で default_random_engine プライベート フィールドを使用する方法はありますか?

4

2 に答える 2

2

これを理解するのに約4時間費やしました。他の誰かがこれに遭遇した場合...

default_random_generator はunsigned long 型のシードのみを取ります。Int、unsigned int、long short byte の dword では切り抜けられません。unsigned int である必要があります。

また、0 でシードできないことに注意してください。実行時エラーが発生します。以下は、私の苦労して獲得したコンパイルコードです...

unsigned long seed = pblock->GetInt(p_seed);
// We cannot seed with 0, so increment by 1 to avoid the error
seed++;
std::default_random_engine generator(seed);
于 2013-11-02T20:15:27.857 に答える