2016-03-20 15 views
1

乱数を取得する簡単な方法を作りたかったのですが、乱数ジェネレータは関数間でシードを失うようです。この例を複数回実行すると、生成された最初の乱数は実行ごとにランダムであり、2番目の乱数は生成されないことがわかります。これの原因は何ですか?グローバル変数の固定乱数発生器を失う

main.cppに

#include <iostream> 
#include "Random.hpp" 
class Global 
{ 
public: 
    Global() 
    { 
     Random::seed(); 
     std::cout << "\n" << Random::getRandom(-10, 10);//random 
    } 
    void Global::doStuff() 
    { 
     std::cout << "\n" << Random::getRandom(-10, 10);//not random 
    } 
}; 
Global globalInstance; 

int main() 
{ 
    globalInstance.doStuff(); 
    return 0; 
} 

Random.hpp

#pragma once 
#include <random> 
class Random 
{ 
public: 

    static void seed(); 
    static int getRandom(int minInclusive, int maxInclusive); 

private: 
    static std::default_random_engine gen; 
    static std::uniform_int_distribution<int> ints; 

}; 

Random.cpp

#include "Random.hpp" 
#include <time.h> 
std::default_random_engine Random::gen; 
std::uniform_int_distribution<int> Random::ints; 
void Random::seed() 
{ 
    gen.seed(static_cast<unsigned int>(time(NULL))); 
} 
int Random::getRandom(int minInclusive, int maxInclusive) 
{ 
    std::uniform_int_distribution<int>::param_type range(minInclusive, maxInclusive); 
    ints.param(range); 
    return ints(gen); 
} 
+0

あなたはgenを静的メンバーにしました。これは静的メンバーと同じように動作します。これは静的非メンバーとは異なります。 – kfsone

+0

投稿を編集し、[mcve]を入力してください。 –

+0

私の間違いは、最小限の完全な検証可能な例を与えておく必要があるときに、私は最小限の例を示しました。 – user46877

答えて

1

あなたが示したコードはrandom.cppに静的スコープのオブジェクトに依存するように見えます静的スコープのオブジェクトの前にインスタンス化されているのはmain.cppです。

これは未定義の動作です。 C++標準では、異なる翻訳単位の静的スコープオブジェクトの相対的なインスタンス化順序を保証しません。

何が起きているかは、main.cppの静的オブジェクトを最初にインスタンス化し、random.cpp翻訳単位で定義されているオブジェクトにランダムなシードを設定することです。これ自体は未定義の動作を含んでいますが、この動作はクラッシュすることなく一見生き残りました。

main.cppの静的オブジェクトがインスタンス化されると、random.cppの静的オブジェクトがインスタンス化され、デフォルトのシード値を使用するようにリセットされます。

+0

ありがとうございました。 Random :: getRandom(min、max)へのグローバルアクセスポイントである私が努力していたことを達成する方法はありますか?それはこのように失敗しない? – user46877

+0

関数スコープが初めて入力されたときに、関数レベルの静的オブジェクトが初期化されるという事実を利用できます。すべてのオブジェクトを単一のクラスにラップし、その内部静的オブジェクトへのポインタを返す関数で静的宣言し、呼び出します。 –