• ベストアンサー

乱数について

C言語で0~1の乱数を作成する部分を書いているのですが num[i] = rand()/(RAND_MAX+0.1); と書いてループさせています。 numはdouble型で定義しているのですがこれで実行すると桁数が下6桁まで表示されてしまいます。 欲しいデータは0.1、0.2・・・1.0までの0.1刻みのデータなのですが桁数を制限するにはどうすればいいのでしょうか?

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

  • ベストアンサー
  • dra2jp
  • ベストアンサー率25% (18/72)
回答No.4

数値を比較したい場合、例えば 実数だと 1.0000000000000 1.0000000000001 は違うものだと判断されます。 しかし実際そこまでの精度で比較する場合があるでしょうか? double型の数値を比較したい場合は、小数点どこまでを比較したいか考え、その桁分、桁上げすればいいのです。 なんだか文章で書くとわかりにくいですね。 実際にプログラムを書きながら見ていきましょう。 int main(){ double x=1.001,y=1.000; } このような宣言でxとyを比較する場合、普通にint型に変換して比較すると同じですね。 例 if((int)x == (int)y) 小数点第1位まで考えて比較しても 小数点第2位まで考えて比較しても同じになります。 しかし 小数点第3位まで考えて比較すると異なりますね。 小数点第一位まで考えて比較する場合 x=x*10; y=y*10; if((int)x == (int)y) とすれば小数点第1位まで考えた事となり 小数点第三位まで考えて比較する場合 x=x*1000; y=y*1000; if((int)x == (int)y) とすれば小数点第1位まで考えた事となります。 わかりますか? あなたはどの制度で比較したいのでしょうか? ただ単に小数部分が必要ないのでしたらint型にそのまま変換すればよく、小数点以下まで比較したいのなら 上記の通り比較すればよいです。 他難しい書き方をすればより簡単に表現できるのですが(なんか矛盾してますね) 一番簡単な例を紹介しました。 この回答で解決しなかった場合などありましたらまた聞いてください。

その他の回答 (4)

  • dra2jp
  • ベストアンサー率25% (18/72)
回答No.5

むむ! 心外な事に × (rand() % 10 + 0.1 ) / 10 ↓ ○ (rand() % 10 + 1 ) / 10 でしたね・・。 ちなみに 0~1.0の乱数が作りたいなら (rand() % 11) / 10 でよいですね。 失礼しました。

  • dra2jp
  • ベストアンサー率25% (18/72)
回答No.3

ただ単に10で割ったあまりを出せば10種類の乱数が作れます。 RAND_MAXとか使わなくても出来ます。 rand() % 10 ↑これで0~9の10種類の乱数が生成可能 これを10で割れば0.0~0.9の乱数が生成可能 0.1~1.0の乱数がほしいのなら 0.1足してから10で割ればよい。 つまりこういう事です。 (rand() % 10 + 0.1 ) / 10 これで0.1~1.0の乱数が生成できます。 n種類の乱数を作りたいときは nで割ったあまりを出せばいいのです。 もっと他の事がやりたかったらまた聞いてください。

vandread
質問者

お礼

なるほど・・・僕はわざわざ複雑なのを使っていたのですね。 それを参考に書き直してみます。 もう一つお聞きしたいことがあるのですが 実数同士を比較する場合 if(「実数1」 == 「実数2」) は使えないと聞きました。比較したい場合は実数1をintで整数化して実数2の部分では実数ではなく整数を使って整数同士を比較すればよいのでしょうか?

回答No.2

1~10の乱数を生成し、10.0で割る

vandread
質問者

お礼

おっしゃるとおりでした。 こんな簡単なアルゴリズムだったんですね。。。 ありがとうございました。

  • agharta
  • ベストアンサー率52% (54/103)
回答No.1

小数第一位までならば四捨五入すればいいのではないですか。 この場合は正の値なので、10倍にして0.5を足した数値を整数化して10分の1にすればいいと思います。 コードが必要ですか?

vandread
質問者

お礼

四捨五入も考えたのですがどうしてもアルゴリズムが思いつかなくて・・・ おっしゃる通りに書いたら小数第一位までの乱数が作れました! コードも自分で記述できましたので大丈夫そうです!ありがとうございました。

関連するQ&A