アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

数値を比較したい場合、例えば


実数だと
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型にそのまま変換すればよく、小数点以下まで比較したいのなら
上記の通り比較すればよいです。

他難しい書き方をすればより簡単に表現できるのですが(なんか矛盾してますね)
一番簡単な例を紹介しました。

この回答で解決しなかった場合などありましたらまた聞いてください。
    • good
    • 0

むむ!


心外な事に
× (rand() % 10 + 0.1 ) / 10

○ (rand() % 10 + 1 ) / 10
でしたね・・。

ちなみに
0~1.0の乱数が作りたいなら
(rand() % 11) / 10
でよいですね。
失礼しました。
    • good
    • 0

ただ単に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で割ったあまりを出せばいいのです。
もっと他の事がやりたかったらまた聞いてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/13 23:41

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/13 23:38

小数第一位までならば四捨五入すればいいのではないですか。



この場合は正の値なので、10倍にして0.5を足した数値を整数化して10分の1にすればいいと思います。

コードが必要ですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/13 23:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!