next up previous
: 繰り返し文 do while : man_c5 : 算術関数

千鳥足

確率・統計の教科書でおなじみの「千鳥足」のシミュレートを行う。ここでは主に関数の説明を行う。

ルールは 0 〜 1 までの疑似乱数を振って

0 以上 0.25 未満 $x$ 方向に -1
0.25 以上 0.5 未満 $y$ 方向に -1
0.5 以上 0.75 未満 $x$ 方向に +1
0.75 以上 1 以下 $y$ 方向に +1


の様に進むことにする5。そして、自分の家( $(x,y) = (10,10)$)に到着した時点 で終了とし、それまでの経路、および歩数をファイルに出力する。ただし、ここ では簡単のため、シェルのリダイレクト ''>'' を用いて出力ファイル out.dat に出力する。

プログラムはそんなに複雑なものではないが、ここでは

の 3 つに分けた。「何でそんなことを…」と思うかも知れないが、機能ごとにファイルを分けることはプログラムの見通しを良くする上で大切である。以下にソースと結果を示す。


random_walk.c --------------------------------------------------------

#include"random_walk.h"

int main(){
  int x = 0, y = 0, i = 0;
  double Prw;
  
  do{
    printf("(x, y) = (%d, %d) \n",x,y);
    Prw = ran();
    if(Prw < 0.25) x--;
    else if((Prw >= 0.25) && (Prw < 0.5)) y--;
    else if((Prw >= 0.5) && (Prw < 0.75)) x++;
    else y++;

    i++;
  }while((x != XHOME) || (y != YHOME));
  printf("(x, y) = (%d, %d) \n",x,y);
  printf("無事に家に着きました。%d 歩 \n", i);
}


ran.c ----------------------------------------------------------------

#define IA 7141
#define IC 54773
#define IM 259200

double ran(){
  static long iseed=12354;

  iseed = (iseed*IA+IC)%IM;
  return (double)iseed/(double)IM;
}


random_walk.h --------------------------------------------------------

#define XHOME 10
#define YHOME 10

double ran();


実行結果 -------------------------------------------------------------

s1:~/c_text> ./random_walk > out.dat
s1:~/c_text> cat out.dat

0, 0 
0, -1 
0, 0 

…

9, 10 
10, 10 
無事に家に着きました。9922 歩 
s1:~/c_text> gnuplot


gnuplot> plot"out.dat" u 1:2