next up previous
Next: 課題-3 Up: 砂山モデル Previous: 砂山モデルの計算例

砂山モデルのプログラム例

/*************************/
/*       砂山モデル      */
/*       2000.01.26      */
/*        By Y. I.       */
/*************************/
#include <stdio.h>
#include <stdlib.h>

#define RC   2147483647.0                      /* 乱数の最大値 */
#define N    500                               /* 系の最大サイズ */
#define M    10000                             /* 雪崩の最大サイズ */

int addsand(int n, int ix, int iy, int s[N][N], int t[])
{
  int ab=0;                                    /* 雪崩回数をリセット */

  s[ix][iy]++;                                 /* 桝目の数字を+1 */
  if(s[ix][iy] == 4)                           /* 数字が4の場合 */
  {
     s[ix][iy]=0;                              /* 桝目をリセット */
     if(ix>0)   ab+=addsand(n,ix-1,iy,s,t);    /* 左隣に+1 */
     if(ix+1<n) ab+=addsand(n,ix+1,iy,s,t);    /* 右隣に+1 */
     if(iy>0)   ab+=addsand(n,ix,iy-1,s,t);    /* 下隣に+1 */
     if(iy+1<n) ab+=addsand(n,ix,iy+1,s,t);    /* 上隣に+1 */
     ab++;                                     /* 雪崩のサイズ+1 */
  }
  return(ab);                                  /* 雪崩のサイズを返す */
}

int main(void)
{
  int s[N][N], t[M];
  int n, last;
  int ix, iy, it, a;

  for(ix=0;ix<M;ix++) t[ix]=0;                 /* 変数のクリア */
  for(ix=0;ix<N;ix++) for(iy=0;iy<N;iy++) s[ix][iy]=0;

  fprintf(stderr, "Size = "); scanf("%d", &n); /* 系のサイズの設定 */
if(n > N) exit(1);                           /* 最大値を越えていたら中止 */
  fprintf(stderr,"Iteration = "); scanf("%d", &last);  /* 全回数の数の設定 */

  for(it=0;it<last;it++)                       /* 全回数だけループ開始 */
  {
    ix=(int)(n*random()/RC);                 /* 乱数により砂を落す桝目を決定 */
    iy=(int)(n*random()/RC);                 /* 乱数により砂を落す桝目を決定 */
    a = addsand(n,ix,iy,s,t) -1 ;            /* 発生した雪崩のサイズ */
    if(a>=0 && a<M) t[a]++;                  /* 雪崩サイズが1以上なら記録 */
  }
  for(ix=0;ix<M;ix++) printf("%d %d\n",ix+1,t[ix]); /* 雪崩サイズの出力 */
}



Yasuyuki Iwase
2000-01-27