« Office 2007のアドオン「SaveAsPDFandXPS」 | トップページ | ランダムウォークとガウス分布 »

2008/07/28

2次元ランダムウォーク

2次元ランダムウォークをプログラムにして可視化してみた。(ブラウン運動に関係しているので)

Link:2次元ランダムウォーク - Wikipedia

まず点を座標(x, y)=(0, 0)に置きます。次の瞬間この点がいる場所は確率1/4で以下のいずれかの場所にいることになる。

  • (x+1, y)
  • (x-1, y)
  • (x , y+1)
  • (x , y-1)

以上を任意のステップ数繰り返すだけ。例えばこのような軌跡を描く。

Randomwalk

プログラムは「randwalk.c」 。(そんなにいい乱数じゃないけどまぁいいや)

/*
  2008/07/28
   2次元ランダムウォーク
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100000

/* 乱数生成 */
void   setSeed() {srand(time(NULL));}
double genRand() {return rand()/(1.0+RAND_MAX);}

/* 座標 */
typedef struct {
  double x;
  double y;
} coordinate;

/* Plot Data */
void runGnuplot(FILE* gp)
{
  fprintf(gp, "set terminal x11\n");
  fprintf(gp, "unset key\n");
  fprintf(gp, "set title 'Random Walk'\n");
  fprintf(gp, "plot 'randwalk.data' w l\n");
}

int main(void)
{
  coordinate point = {0.0, 0.0};
  FILE*      fp    = fopen("randwalk.data", "w");
  FILE*      gp    = popen("gnuplot -persist", "w");
  int        i;

  setSeed();  // Set Random Seed
  
  for(i = 0; i < N; i++){
    double prob = genRand();
    if(prob < 0.25)
      point.x += 1.0;
    else if(prob >= 0.25 && prob < 0.5)
      point.x -= 1.0;
    else if(prob >= 0.5  && prob < 0.75)
      point.y += 1.0;
    else
      point.y -= 1.0;
    
    fprintf(fp, "%g, %g\n", point.x, point.y);
  }
  fclose(fp);

  runGnuplot(gp);
  pclose(gp);
  
  return 0;
}

|

« Office 2007のアドオン「SaveAsPDFandXPS」 | トップページ | ランダムウォークとガウス分布 »

C」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/222903/42000111

この記事へのトラックバック一覧です: 2次元ランダムウォーク:

« Office 2007のアドオン「SaveAsPDFandXPS」 | トップページ | ランダムウォークとガウス分布 »