C/C++ ( いわゆる BetterC ) でやっています。
"C 標準の srand/rand で乱数発行は あまりよくない" というサイトページを何度か見かけたことがあります。
理由は
-
グローバル変数を使っていること
-
乱数の範囲が固定 ( randで発行できる最大値が 決まっている )
らしいです。
なので、Boost の random を使おうと思い 質問したところ、
「C++11 のrandom を使った方がいい」というアドバイスをもらいました。
なので、「C++11 random」で検索してヒットした「cpprefjp - C++日本語リファレンス」
というサイトのサンプルコードを参考 ( ほぼ流用? ) して以下のクラスを作成しました。
C++
1// CRandom.h 2 3// ここにインクルードガードがあるとして。 4 5#include<string> 6#include<time.h> 7#include<random> 8 9 10class CRandom{ 11 public: 12 CRandom( double min, double max ); 13 ~CRandom(); 14 15 double RandDouble( void ); 16 int RandInt( void ); 17 private: 18 std::random_device seed_gen; // シード 19 private: 20 double min; 21 double max; 22}; 23
C++
1// CRandom.cpp 2 3#include"CRandom.h" 4 5using namespace std; 6 7 8// コンストラクタ。取りうる 最小値と最大値 を受け取り、メンバ変数に格納 9CRandom::CRandom( double min, double max ){ 10 this->min = min; 11 this->max = max; 12} 13 14// デストラクタ。今のところ空。 15CRandom::~CRandom(){ 16 17} 18 19// double型として乱数を発行する 20double CRandom::RandDouble( void ){ 21 default_random_engine engine( seed_gen() ); 22 23 // 少数として生成する 24 uniform_real_distribution<> dist( min, max ); 25 26return dist( engine ); 27} 28 29// int型として乱数を発行する 30int CRandom::RandInt( void ){ 31 default_random_engine engine( seed_gen() ); 32 33 // 整数として生成する 34 uniform_int_distribution<> dist( (int)min, (int)max ); 35 36return dist( engine ); 37}
として、
main関数がある main.cpp に
C++
1// main関数内として。 2 3int r; // 乱数 4 5CRandom* Random; 6 7// 乱数の範囲は 0 - 4 とする 8Random = new CRandom( 0, 4 ); 9 10for( int i = 0; i < 10; i++ ){ 11 // 乱数発行 12 r = Random->RandInt(); 13 14 cout << r << endl; 15} 16 17delete Random; 18
としてコンパイル&実行したところ、
1
4
2
4
3
3
1
4
1
3
となりました。
ここまではいいのですが、何度起動しても同じ組み合わせです。
これを srand( time( NULL ) ); で初期化したような感じで、
起動毎に出てくる数値を変えたいのです。
たとえば、
起動一回目:
1
4
2
4
3
3
1
4
1
3
起動二回目:
2
5
6
2
3
3
4
1
0
0
...
という感じにしたいのです。
どこを修正すればいいのやら...
C++11 は使い慣れていない ( というより、C++ 自体使いきれていてない。 ) ので、
宜しくお願い致します。
[環境等]
言語: C/C++ ( C++11 )
コンパイラ: MinGW ( g++ )
宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/23 07:23 編集
2016/12/23 04:30
退会済みユーザー
2016/12/23 04:47