- ベストアンサー
MFCにて乱数
CString time; p=rand()%20*1000+1; time.Format(_T("%d"),p/1000); にて変数pに乱数を代入し、画面出力します。 CString strp; strp.Format(_T("%d"), p/1000); にてpを型変換して、画面出力するのですが、双方のpの値が一致しません。 どうなってるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
・変数pの宣言。 ・この2つのpは「同じ」ものなのか?別の関数の別のローカル変数とかいうことは無いか? ・同一だとしたら、この2つの間でどうなっているのか? ・「一致しない」の具体例は? 余談。 rand()を使うなら、(int)(20.0 * rand() / RAND_MAX) * 1000 + 1の方が乱数の質がよいです。 理由は探してみてください。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
できる限り「問題の発生する完全なプログラム」を出してください. これでは「途中で p を書き換えてるんでしょ」で終わっちゃう. あと, グローバル変数の是非はおいても名前は考えてほしい. 可視範囲が狭いなら適当でもそれなりに何とかなるけど (単なる「forループのカウンタ」なら i で十分だ), グローバル変数に「p」なんて名前はあり得ない. 意味の分かる名前にすべき.
お礼
すみません、、、あまりに拙いプログラムで恥ずかしくて抜粋しました。 尚、質問の件は自己解決致しました。 もっともっと初歩的な箇所を見落としていました。 グローバル変数名については貴重なご意見ありがとうございます。 今後気をつけていきたい次第です。
- kmee
- ベストアンサー率55% (1857/3366)
乱数と言ったって、 > p=rand()%20*1000+1; とした時に変わるだけで、他に変更するようなことをしなければ、そんなことにはなりません。 > CString time; > p=rand()%20*1000+1; > time.Format(_T("%d"),p/1000); > CString strp; > strp.Format(_T("%d"), p/1000); と5行が連続で処理しているのでしょうか?それとも > CString time; > p=rand()%20*1000+1; > time.Format(_T("%d"),p/1000); ※ pを変更しないはずの処理 > CString strp; > strp.Format(_T("%d"), p/1000); となっているのでしょうか? また、これは、シングルスレッドでしょうか? 別の処理が割り込まないように制御されたものでしょうか? 間に別の処理が入る可能性のあるのでしょうか? timeに使ってるので、タイマーに関連してそうですが、そうすると、タイマーで定期的に値が変わったりしませんか? なんにせよ、変数名が本当にpなら、そんなグローバル変数は間違いのもとです。 名前は別にするとして、グローバル変数を使わない方法も考えた方がいいと思います。
お礼
5行は連続ではなく、後者のほうです。 一応処理は上から順に逐次処理していく形になっておりますが、、、 前半の後はif文分岐が10くらいあり、そのひとつが後半になっています。 もしかしたらそこに問題があるんですかね? 後たまたま変数名をtimeにしただけでタイマ-は使ってはいません。 一応他の関数でもpを用いるのでグローバル変数にしたのですが、、、やはりローカルにしたほうが良いのでしょうか?
お礼
pは同じグローバル変数で、上記は全て同じ関数内です。更に上と下の間でpをいじったりはしていません。 多分下のp(毎回値が変わるので。しかも上のpとは異なる)も乱数になっているのかと思います。 乱数の質の件は参考に致します。 回答ありがとうございます。