質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3636閲覧

乱数で範囲を指定したい

h_proc

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/23 04:13

前提・実現したいこと

rand関数を使って範囲を指定して乱数を発生させたいです。
-0.05から0.05の範囲に指定したいのですが、実行すると、0.00しか表示されません。
ここに質問の内容を詳しく書いてください。
関数が呼び出されるたびに、乱数を返したいです。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

#include <stdio.h> #include <stdlib.h> int rnd_generate(double min, double max); int rnd_generate(double min,double max) { double dt = 0; dt = min + (double)(rand() / (max - min + 1.0)) * (RAND_MAX + 1.0); return dt; } int main(void) { printf("%f\n", rnd_generate(-0.05, 0.05)); return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C

int rnd_generate(double min,double max)
{
...
return dt;
}

返り値をint型にキャストする処理が走っています。適切な型(double)を指定してください。


rnd_generateの実装自体も間違っていそうな雰囲気です。
関数を適切に分けた方が書きやすいと思いますが。

C

1double d_rand(void) { 2 return 1. * rand() / RAND_MAX; 3} 4double d_rand_range(double min, double max) { 5 return d_rand() * (max - min) + min; 6}

投稿2018/11/23 04:19

編集2018/11/23 05:17
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/11/23 06:05

回答ありがとうございます。恐れ入りますが、int型にキャストする処理というのはどういうものを指すのでしょうか。関数を分けて再度作ってみようと思います。やはり、関数一つだと難しいのでしょうか。
LouiS0616

2018/11/23 06:09

> int型にキャストする処理というのはどういうものを指すのでしょうか 戻り値にint型を指定しているので、return dt; は実際には return int(dt); のように動作します。 小数点以下切り捨てです。 > 関数一つだと難しいのでしょうか。 一般に、物事は適切に分割すると分かり易くなります。 私の場合『0から1の浮動小数の乱数を返す関数』が切り離されている方がしっくりくるだけです。
h_proc

2018/11/23 06:19

丁寧に教えていただき、ありがとうございました。無事、ソースコードが完成し、正しく実行されました。
guest

0

r.c

c

1#include <stdio.h> 2#include <stdlib.h> 3 4double rnd_generate(double range_0, double range_1) { 5 double t = (double)rand() / RAND_MAX; 6 return range_0 + (range_1 - range_0) * t; 7} 8 9int main(void) { 10 11 for (int i = 0; i < 10; i++) { 12 printf("%f\n", rnd_generate(-0.05, 0.05)); 13 } 14 printf("\n"); 15 16 for (int i = 0; i < 10; i++) { 17 printf("%f\n", rnd_generate(0.05, -0.05)); 18 } 19 printf("\n"); 20 21 for (int i = 0; i < 10; i++) { 22 printf("%f\n", rnd_generate(0.05, 0.05)); 23 } 24 printf("\n"); 25 26 return 0; 27}

実行例
イメージ説明

範囲指定の数値の大小関係が逆転していたり、同じ値を指定したときにも、範囲中の乱数が得られることがわかります。

rnd_generate()中の t は 0.0 ,, 1.0 の範囲の値になります。
t = 0 なら、range_0 を返します。
t = 1 なら range_1 を返します。
t = 0.5 なら range_0 から renge_1 へ 半分だけ進んだ値を返します。

投稿2018/11/23 05:13

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/11/23 06:13

回答ありがとうございます。同様のソースコードを書いてみたのですが、やはり、0.00と表示されてしまいます。もう少し考えてみます。
katoy

2018/11/23 06:51

> ... 同様のソースコード ... 質問文の中の int rnd_generate(double min,double max) を double rnd_generate(double range_0, double range_1)に置き換えるだけで済むはずです。 int rnd_generate(...) と int を返すままになっているのではと想像されます。double rnd_generate(...) とすることが重要な変更点の1つです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問