C言語を始めてまだ1ヶ月弱という初心者です。
初心者ということで課題については徐々にステップアップしながらの勉強なのですが
「乱数の連検定」ぽいプログラムでつまづいてしまいました。
今やってるプログラムは「”rand()%10”で作った一桁の擬似乱数の連検定」です。
たとえば乱数が[1.4.6.5.3.7.9.6.5.4.3.7.4.2.3.4.0.9.0.5.4.2.4.5.6.・・・・(一万個の乱数)]という具合にあるとしたら
[1.4][4.6][6.5]・・・・という並びがいくつずつあるのか?を検定するものです。
つまり[00]が何個、[01]が何個、[02]が何個・・・[98]が何個、[99]が何個、というように数えていくものです。
とりあえず下記のプログラムを作ったのですが、一応はちゃんとした結果は出ます。
ただ、for文でグルグルまわして無駄な処理を10000×10000回やってるので、自分でもいまいちなものになってます。
#include<stdio.h> int main (void) { int i,j,k,m,n; int ransu[15000][10]; int count; FILE*fp; //rand1.txtに擬似乱数を書き込む fp = fopen("rand1.txt", "w"); for(i=0;i<10000;i++){ fprintf(fp,"%d\n",rand()%10); } fclose(fp); //rand1.txtから擬似乱数をransu配列に書き込む fp = fopen("rand1.txt","r"); for(i=0; i<10000; i++){ fscanf(fp, "%d",&ransu[0]); } fclose(fp); //擬似乱数の連検定 for(k=0; k<10; k++){ for(m=0; m<10; m++){ count=0; for(n=0; n<10000; n++){ if(ransu[n][0]==k && ransu[n+1][0]==m) count++; } printf("%d\t",count); if(m!=0 && m%9==0)printf("\n"); } } }
配列[00]~[99]までをあらかじめ用意しておいて、rand()関数で乱数を発生させると同時に
[1.4.6.5.3.7.9.6.5.4.3.7.4.2.3.4.0.9.0.5.4.2.4.5.6.・・・・(一万個の乱数)]という乱数なら
1.4が出た時点で配列[14]に入れる、4.6が出たら配列[46]に入れるというようなプログラムって出来るものなんですか?
わかりにくい説明でスンマセン m(__)m
ヘルプお願いします。