- 締切済み
0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒスト
0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒストグラムをプリントアウトしたいです.また,a とnはコマンドラインから引き渡します 0 からa-1 までの整数を発生する乱数の書き方は (int)((double)rand()/((double)RAND_MAX+1) *a); プログラムをRandHist としたとき RnadHist 10 1000 と入力すれば 0 982 1 1035 2 956 3 1102 ・ ・ 9 971 などと。出力されるようなプログラムを作る問題ですが,a とn は、任意に変えられるように したいです. どなたか教えてください.
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- magicalpass
- ベストアンサー率58% (378/648)
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <math.h> #include <time.h> int main(int argc, char *argv[]) { int a, n; int *HistBuf; int i; int num; time_t tmdat; a = atoi(argv[1]); n = atoi(argv[2]); // ヒストグラムの集計領域 HistBuf = (int *)malloc(sizeof(int) * a); for (i = 0; i < a; i++) { HistBuf[i] = 0; } // 乱数初期化 srand((unsigned)time(&tmdat)); // 乱数を統計する for (i = 0; i < n; i++) { num = (int)((double)rand()/((double)RAND_MAX+1) * a); HistBuf[num]++; } // 結果を出力 for (i = 0; i < a; i++) { printf("%d %d\n", i, HistBuf[i]); } // メモリ解放 free(HistBuf); return(0); }
- kmee
- ベストアンサー率55% (1857/3366)
どの部分がわからないのでしょうか? ・コマンドラインでの指定はとりあえず置いといて、a=10 n=1000 を直に書いてのプログラムはできていますか? →まずはこれから作ってください。 http://okwave.jp/qa/q4519019.html 等も参考になるでしょう。これはテキストファイルから読み込む、負の値まで含めたヒストグラムですが、今回は読み込む必要もゲタをはかせる必要もない分もっと簡単になるはずです。 ・コマンドラインからの値の取り込み方がわからない →「C言語 コマンドライン引数」で検索すれば、関連資料がたくさん見つかります。 あるいは、慣習的に使われる変数名である「argc argv」でも見つかります。 ・コマンドライン引数に合せて配列の大きさを変える方法がわからない。 →アプローチは2つ。十分に大きな配列を確保して必要なところだけ使う方法と、入力に合せた配列をその都度用意する方法。 後者は「動的なメモリ割り当て」で検索。 使っているコンパイラがなんだかわかりませんが、それによっては、特に工夫もなしに、配列宣言の添字として変数が使える 例) int a=10; int hist[a] ;
お礼
現在このようなプログラムを書いています. しかし,思ったように乱数表示,ヒストグラムのプリントアウトができず困っています. 配列については静的確保,動的確保については多少理解できましたがアドバイスいただけると幸いです. #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <math.h> int main(int argc, char *argv[]) { int a[10]={0,1,2,3,4,5,6,7,8,9}; //配列(静的確保) int n; //乱数の数用 int i,j,k,m; //forループ用変数 a[10]=atoi(argv[1]); //atoi関数 n=atoi(argv[2]); //atoi関数 //引数のチェック if(argc!=3) { printf("引数の数が違います\n"); exit(0); } //引数の表示 for(j=0; j<argc; j++) { printf("argv[%d]=%s\n",j,argv[j]); } //乱数 for(k=0; k<n; k++) { n=(int)((double)rand()/((double)RAND_MAX+1) * a[10]); } for(m=0; m<a[10]; m++) { printf("%d %d\n",m,a[k]); } }
補足
ありがとうございます. 乱数発生については理解できました. 宿題では配列において静的確保,動的確保について,2つのプログラムを作成しなければなりません. もう少し頑張ってみます
補足
お礼が遅くなり申し訳ございません. 補足がなく大変申し訳ないのですが,配列を使ったプログラミングでした. また,#include <time.h>は使わずに,乱数を発生させたいと思っています. せっかくご回答いただいたにも関わらず補足が足りなくてもうしわけございませんでした.