• ベストアンサー

初期化しているつもりなのに、初期化されずにrand関数の結果を得る

皆様。こんにちは。 C++で簡単なプログラムを書いていたつもりでしたが、 コンパイルが正常であった後に、 プログラムを動作させてみたら、 自分の意図とは少し異なる結果となり、 どこが違うのか?が どうも自分では分かりかねてしまい、 アドバイスをいただきたく 質問させていただきました。 以下の例にあるように、 「a」と「b」という2文字の間に ランダム関数で作成した「任意の数字」を挟む処理を行い その結果を画面に表示するつもりです。 また、この処理を「num」で指定した回数分だけ 実行させたいと思っていました。 ■表示させようとした結果:「a」+「生成した乱数」+「b」 ■担当プログラム ------------------------------------------------------ for (int i=0; i<num; i++) { std::stringstream keystream ; srand((unsigned)time(NULL)); // 乱数の初期化 int randomnum = rand()% 109999999; // 乱数の生成 keystream << "a" << randomnum << "b" ;    printf(keystream); } ------------------------------------------------------ しかし、実際には、 指定された回数分だけの、 表示結果は得られるものの、 a123456b a123456b a123456b a123456b a123456b 上記例(num=5)のように、 乱数の部分が、全部同じ乱数となっていました。 しかし、forの中で 新たに乱数を生成する際、 生成する前に、 乱数の初期化をしているつもりでいますので、 プログラムを実行させた場合に、 表示させれた結果が、 どうして全て同じ乱数を得ているのか?が分からないでいます。 何かアドバイスいただけるとありがたいです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> 乱数の初期化をしているつもりでいますので、 > プログラムを実行させた場合に、 > 表示させれた結果が、 > どうして全て同じ乱数を得ているのか?が分からないでいます。 毎回初期化してるからです。 srand を for-loop の外に追い出して 「一度だけ」初期化しましょう。

stadiumk
質問者

お礼

早期にご回答いただきまして ありがとうございました! 正に、正に、 そのとおりでした! いい勉強になりました。 大変感謝しております。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

srand( )は乱数のシードを設定する関数ですがこれに同じ値を指定するとrand( )で得られる数値も同じになります。 srand( )の引数にtimeを指定していますがパソコンはかなり高速に実行されるのでループの間timeの値も一定になってしまいその結果rand( )の値も同じになるわけです。 srand( )はプログラムの最初に1回だけ実行するようにしましょう。

stadiumk
質問者

お礼

php504さん ご回答いただきまして、 ありがとうございました! 初期化の件、とても参考になりました! 問題解消できました! 大変感謝しております。

関連するQ&A