2017-04-24 17 views
1

以下のコードで生成されるすべてのオブジェクトは、randomNumber1とrandomNumber2の値が同じです。 std :: default_random_engineを正しく使用するには?あなたはシードを再ためだランダムなデータメンバー値を持つオブジェクトを作成するにはどうすればよいですか? C++

#include <random> 
#include <iostream> 

class Food{ 

    public: 
     int randomNumber1; 
     int randomNumber2; 
     Food(){ 
      std::default_random_engine generator; 
      std::uniform_int_distribution<int> distribution(1,40); 
      std::uniform_int_distribution<int> distribution2(1,30); 
      randomNumber1 = distribution(generator) * 20; 
      randomNumber2 = distribution2(generator) * 20; 
     }; 
}; 

int main(){ 

    Food * food = new Food(); 
    std::cout << food->randomNumber1 << " " << food->randomNumber2 << std::endl; 
    Food * food1 = new Food(); 
    std::cout << food1->randomNumber1 << " " << food1->randomNumber2 << std::endl; 
    Food * food2 = new Food(); 
    std::cout << food2->randomNumber1 << " " << food2->randomNumber2 << std::endl; 

    return 0; 
}; 

答えて

3

は(同じシード付き)engineたびにあなたがFoodオブジェクトを作成します。

static std::default_random_engine generator; 
std::uniform_int_distribution<int> distribution(1,40); 
std::uniform_int_distribution<int> distribution2(1,30); 
randomNumber1 = distribution(generator) * 20; 
randomNumber2 = distribution2(generator) * 20; 

をか...呼び出し側がシードを決めてみましょう:あなたはどうする可能性は、それがstaticので、それは一度だけ播種のmakeです。

あるいは、@Unimportantがコメントで言うように、std::random_deviceを使用します。まだ

static std::random_device dev; 
static std::default_random_engine generator(dev()); 
+0

以上、コンストラクタの引数としてそれを提供しています。 'static' ...それは呼び出し側が決めるべきことです:) – xtofl

+1

本当にランダムなシードを得るために' std :: random_device'を使用してください。 – Unimportant

+0

@重要なはい、追加されました。 –

関連する問題