2017-01-25 8 views
2

メルセンヌ乱数ジェネレーターをメンバー変数として保持し、同じクラスで使用する方法を知りたい。メンバー変数としてメルセンヌツイスターシード

私はこのクラスを以下のように書いていますが、完全に動作しますが、std::mt19937が初期化されているのは気に入らないのです。私はTestのコンストラクタでそれを初期化する方法があるかどうかを知りたいですか?

#include <iostream> 
#include <cmath> 
#include <random> 
#include <chrono> 
#include <ctime> 

class Test{ 
public: 
    Test() 
    { 

    } 
    void foo() 
    { 
     auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd); 
    } 

private: 
    std::mt19937 rnd 
    { 
     std::chrono::high_resolution_clock::now().time_since_epoch().count() 
    }; 
} 
+1

なぜそれをしたいですか?現在のコードの問題は何ですか?そして、初期化をコンストラクタに移動する際の問題は何ですか?何かしようとしましたが、それは仕事をしませんでしたか? – user463035818

+4

メンバーの初期リストをお探しですか? 'Test():rnd(seed){... blah ...}'。 – HolyBlackCat

+0

2つの方法:最初に、コンストラクタの初期化子リストを使用して変数を初期化します。これは基本的にあなたが今やっていることと同じです。 2番目の方法は、コンストラクタ本体の中のコピー代入演算子を使用して、一時オブジェクトから 'm_random'オブジェクトにコピーすることです。 –

答えて

4

私はあなたがクラス初期化が何をしているのか正確に混同していると思います。あなたはクラスの初期化に

struct foo 
{ 
    foo() : bar(10) {} 
    int bar; 
}; 

コンパイラはメンバー初期化子リストにメンバーを追加するたびに(これは、あなたがそれを忘れてしまったときに行わまたはコンパイラれるためだけの構文糖であることを

struct foo 
{ 
    foo() {} 
    int bar = 10; 
}; 

を持っている場合コンストラクタを提供します)、初期化で使用したものを使用します。だからあなたのコード

class Test{ 
public: 
    Test() 
    { 

    } 
    void foo() 
    { 
     auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd); 
    } 

private: 
    std::mt19937 rnd 
    { 
     std::chrono::high_resolution_clock::now().time_since_epoch().count()}; 
    }; 
}; 

で実際にそのようにやって、あなたがで開始することをどうやったのか使用しないことについての素晴らしい事は、あなたが

rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count()) 
を繰り返す必要はありませんです

class Test{ 
public: 
    Test() : rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count()) 
    { 

    } 
    void foo() 
    { 
     auto randomNum = std::uniform_int_distribution<>(0, threads.size())(rnd); 
    } 

private: 
    std::mt19937 rnd; 
}; 

になりすべてのコンストラクタでは

を記述しますが、特定のコンストラクタに対して他のものが必要な場合は、常にそれをオーバーライドできます。

+0

小さなもの。 std :: random_deviceをstd :: mt19937でどうやって使うのですか? –

+0

@TharinduKumaraもしあなたがしたいのであれば、初期化を行い、ジェネレータを返す関数を書くでしょう。その後、その関数を使ってジェネレータを初期化することができます。 – NathanOliver

+0

@Nathanm、このように使うことができます。 'Test():rnd(std :: random_device {}()){......}'である。 –

関連する問題