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

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

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

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

Q&A

解決済

3回答

2221閲覧

0-1の範囲で乱数を10,000個発生させ、0.1刻みのヒストグラムを作成したいのですが、度数が明らかにおかしいです。アドバイスをください。

Murasaki_PurPle

総合スコア37

C

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

0グッド

1クリップ

投稿2019/08/09 12:09

0-1の範囲で乱数を10,000個発生させ、0.1刻みのヒストグラムを作成

0-1の範囲で乱数を10,000個発生させ、0.1刻みのヒストグラムを作成したいのですが、度数が明らかにおかしいです。アドバイスをください。

発生している問題

0 (0番目の度数) 993 (1番目の度数) 1007 (2番目の度数) 998 (3番目の度数) 958 (4番目の度数) 1001 (5番目の度数) 1049 (6番目の度数) 989 (7番目の度数) 963 (8番目の度数) 2042 (9番目の度数) 「n番目の度数」とは、n-1/10<=x<n/10で発生した乱数の個数です。

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3 4int main(void) 5{ 6 int ii, rnd, k, j; 7 float x; 8 9 int dosu[10]={0}; 10 float ransu[10000]={0}; 11 12 for(ii=0; ii<10000; ii++){ 13 k=ii+1; 14 rnd=rand(); 15 x=(float)rnd/RAND_MAX; 16 ransu[ii]=x; 17 /*ii番目に発生させた乱数は、変数ransuのii番目の要素として格納した*/ 18 19 if(0<=ransu[ii]<0.1) dosu[0]++; 20 else if(0.1<=ransu[ii]<0.2) dosu[1]++; 21 else if(0.2<=ransu[ii]<0.3) dosu[2]++; 22 else if(0.3<=ransu[ii]<0.4) dosu[3]++; 23 else if(0.4<=ransu[ii]<0.5) dosu[4]++; 24 else if(0.5<=ransu[ii]<0.6) dosu[5]++; 25 else if(0.6<=ransu[ii]<0.7) dosu[6]++; 26 else if(0.7<=ransu[ii]<0.8) dosu[7]++; 27 else if(0.8<=ransu[ii]<0.9) dosu[8]++; 28 else if(0.9<=ransu[ii]<=1.0) dosu[9]++; 29 30 printf("%f (%d番目の乱数)\n", ransu[ii], k); 31 32 } 33 for(j=0; j<10; j++){ 34 printf("%d (%d番目の度数)\n",dosu[j] ,j); 35 } 36 37 return 0; 38} 39

試したこと

度数の合計が10000になるので、ちゃんと10,000個の乱数が発生しているようです。

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

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

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

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

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

guest

回答3

0

0<=ransu[ii]<0.1

a <= x < b は a <= x && x < b と書くべし。

投稿2019/08/09 12:16

episteme

総合スコア16614

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

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

0

ベストアンサー

間違えているところは、他の回答の通りです。
数式とプログラムの書き方は違います。

書き直すとすると、

C

1 if(ransu[ii]<0.1) dosu[0]++; // 正に決まっているので0と比べなくていい 2 else if(ransu[ii]<0.2) dosu[1]++; // elseなので0.1以上に決まっている 3 else if(ransu[ii]<0.3) dosu[2]++; // 同様 4 else if(ransu[ii]<0.4) dosu[3]++; // 同様 5 else if(ransu[ii]<0.5) dosu[4]++; // 同様 6 else if(ransu[ii]<0.6) dosu[5]++; // 同様 7 else if(ransu[ii]<0.7) dosu[6]++; // 同様 8 else if(ransu[ii]<0.8) dosu[7]++; // 同様 9 else if(ransu[ii]<0.9) dosu[8]++; // 同様 10 else dosu[9]++; // elseなので0.9以上に決まっているし、1未満に決まっている

else ifの意味をよく分かっていないのでは無いでしょうか。

実用的には、このように1行で書けます。

C

1 dosu[ransu[ii]*10]++

投稿2019/08/09 13:18

otn

総合スコア84557

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

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

Murasaki_PurPle

2019/08/11 08:49

丁寧な回答をありがとうございます。 駆け出しの学生ですので、まだまだ理解の浅い部分が多々あるようです。 otn様の解説が丁寧だったので、ベストアンサーにさせていただきました。
guest

0

if(0<=ransu[ii]<0.1) dosu[0]++;

明らかに間違い。
--> if ((0<=ransu[ii]) && (ransu[ii]<0.1)) dosu[0]++;

他も同様です。


[追記]
(0<=ransu[ii]<0.1) --> ((0<=ransu[ii]) < 0.1) で、(0<=ransu[ii]) 常に真 (1)、従って、(1 < 0.1) は、常に偽となります。(C言語の場合)

でもよく見ると、
if(0<=ransu[ii]<0.1) dosu[0]++; => if(ransu[ii]<0.1) dosu[0]++; でも良く、その他も同様、、

ですが、 一連の if()elseif()は、dosu[(int)(ransu[ii] * 10)]++; だけでも良さそう。

投稿2019/08/09 12:17

編集2019/08/09 13:12
pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問