ページ 11

GetNowCount()について

Posted: 2008年9月23日(火) 08:04
by JugS
クラスAのデータメンバ block[10][10] をすべて0で初期化したあとに
クラスAのコンストラクタ内で

A::A(){
int count=0;

for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(count < 10){
block[j] = GetNowCount()%2;
if(block[j] != 0)
count++;
}
}
}

というふうに
block[10][10]の中の要素10個にランダムで1を入れたいのですが、
何度実行してもblock[0][0]から block[0][9]までに
0か1が入ってしまうんです。
コンパイルし直すたびに0か1のどちらかに偏ります。

どうしてでしょうか?

Re:GetNowCount()について

Posted: 2008年9月23日(火) 08:36
by 管理人
GetNowCountは乱数じゃなく、PCが起動してからの経過ミリ秒です。
乱数を使う時はGetRandをお使い下さい。

Re:GetNowCount()について

Posted: 2008年9月23日(火) 11:40
by JugS
あ、そういえばGetRandがありましたね。
すっかり忘れてました。

ですが、上記のプログラムの

block[j] = GetNowCount()%2は,

起動してからのミリ秒を2で割ったあまりを代入しているのだから、
0か1が入ると思うのですが、
実行するとblock[0][0]~block[0][9]が、全て0か1に統一されてしまい、
block[1][0]以降には行かないのですが、
どうしてですか?

Re:GetNowCount()について

Posted: 2008年9月23日(火) 12:13
by ibis
その処理にかかる時間が1ミリ秒より短いからではないでしょうか?

Re:GetNowCount()について

Posted: 2008年9月23日(火) 12:57
by バグ
そうですね、1ミリ秒よりも短い時間で処理が終了してしまえば、全て同じ数値になりますね。
仮に…

block[j] = GetNowCount()%2

この処理の前か後に

Sleep(1);

これを足してみてください。
これで変化があると思います。

Re:GetNowCount()について

Posted: 2008年9月23日(火) 15:46
by JugS
指摘どおり、Sleep(1)をいれたらちゃんとばらけました。

いつもメインループ内で使っていたので、ループ処理の時間差を見落としてました。

ご指摘ありがとうございます。