• 締切済み

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 は、任意に変えられるように したいです. どなたか教えてください.

みんなの回答

回答No.2

#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); }

bqqff440
質問者

補足

お礼が遅くなり申し訳ございません. 補足がなく大変申し訳ないのですが,配列を使ったプログラミングでした. また,#include <time.h>は使わずに,乱数を発生させたいと思っています. せっかくご回答いただいたにも関わらず補足が足りなくてもうしわけございませんでした.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

どの部分がわからないのでしょうか? ・コマンドラインでの指定はとりあえず置いといて、a=10 n=1000 を直に書いてのプログラムはできていますか? →まずはこれから作ってください。 http://okwave.jp/qa/q4519019.html 等も参考になるでしょう。これはテキストファイルから読み込む、負の値まで含めたヒストグラムですが、今回は読み込む必要もゲタをはかせる必要もない分もっと簡単になるはずです。 ・コマンドラインからの値の取り込み方がわからない →「C言語 コマンドライン引数」で検索すれば、関連資料がたくさん見つかります。 あるいは、慣習的に使われる変数名である「argc argv」でも見つかります。 ・コマンドライン引数に合せて配列の大きさを変える方法がわからない。 →アプローチは2つ。十分に大きな配列を確保して必要なところだけ使う方法と、入力に合せた配列をその都度用意する方法。 後者は「動的なメモリ割り当て」で検索。 使っているコンパイラがなんだかわかりませんが、それによっては、特に工夫もなしに、配列宣言の添字として変数が使える 例) int a=10; int hist[a] ;

bqqff440
質問者

お礼

現在このようなプログラムを書いています. しかし,思ったように乱数表示,ヒストグラムのプリントアウトができず困っています. 配列については静的確保,動的確保については多少理解できましたがアドバイスいただけると幸いです. #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]); } }

bqqff440
質問者

補足

ありがとうございます. 乱数発生については理解できました. 宿題では配列において静的確保,動的確保について,2つのプログラムを作成しなければなりません. もう少し頑張ってみます

関連するQ&A

  • N個の整数の並び替えるアルゴリズム

    N個の整数1,2,3,...Nから任意のM個(M < N )を取り出すのですが、重複はダメという場合、どのようなアルゴリズムがあるでしょうか。重複ありなら、Nまでの一様乱数を発生させて整数化して取り出すことは可能です。今回は重複なしです。重複があったらやり直して重複なしになるまでやり続けるというのはダメだなと思っています。 データ処理言語のRはコマンド1つのようですが。言語はFortranなのですが、アルゴリズムのレベルだとどれでも同じと考えています。よろしくお願いします。

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • C++で乱数を重複しないように発生させる

    C++で乱数を重複しないように発生させるようにプログラムを変更しろと言われたのですが、できません。 教えていただきたいです。 #include<iostream> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int main() { int i,n; int *p; cout<<"何個記憶しますか?"<<endl; cin>>n; p=new int[n]; if(p==NULL){ cout<<"記憶域の確保に失敗しました。"<<endl; return 1; } srand((unsigned)time(NULL)); rand(); i=0; while(i<n){ p[i]=1+(int)((double)rand()/(RAND_MAX+1.0)*75); if(p[i]==p[i]) cout<<"p["<<i<<"]の値"<<p[i]<<endl; i++; } delete[] p; return 0; }

  • 1~Nの中から、任意にM個の数を返す関数

    PHP初心者です。 PHPのソースを眺めていて、 mt_rand(1、N) とあり、それが、1~Nの中から、任意に一つ選び出す(乱数を発生させる)関数 ということは理解できました。 そこで、1~Nの数から、任意にM個選び出す(乱数を発生させる)関数を考えています。 そんな関数がドンピシャリあれば、話が早いんですが、 あいにく、知りません。。 例えば、N=10、M=3だとすれば、 7、4、9 などの数を得たいと思っています。 (重複はせずに) 何か、いい方法はありませんでしょうか。 ご存知の方、よろしくお願いいたします!

    • 締切済み
    • PHP
  • 乱数の利用で、九つのセルにそれぞれ違う数を(整数)を返すことはできるの

    乱数の利用で、九つのセルにそれぞれ違う数を(整数)を返すことはできるのでしょうか。 =INT(RAND()*10)を使うのは、わかるのですが、、、。

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • エクセルの乱数発生についてお尋ねします。

    rand()のような関数のファミリーを使うと乱数が発生できます。 そこで、ある程度広がりを持ったシート内に乱数を発生させました。 それは満足していますが、マウスで処理をしたり、何かをアクティブにしたり非アクティブにしたりする操作をすると、乱数が毎回発生してしまいます。シートの数字がパッと変わるのです。 乱数を発生させるタイミングがコントロールできていないわけですが、どのように考えたらいいでしょうか。1回乱数を発生させたら固定したままで、”では、ここで乱数を発生させる”というコマンドの出し方なのですが。エクセルではどうしたらいいでしょうか。