/*
Random Walk

*/

#include 
#include 

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

unsigned long int idum =1024;

float ran1(long *);

main(void)
{
  double x=0.0, y=0.0;
  int i=0;

  for (i=0;i<10000000;i++)
    {
      x=ran1(&idum);

      if (x > 0.5)
	y++;
      else if (x < 0.5)
	y--;
      printf("%d %f\n", i, y);
    }
  return (0);
}

float ran1(long *idum)
{
  int j;
  long k;
  static long iy=0;
  static long iv[NTAB];
  float temp;
  
  if(*idum <= 0 || !iy){
    if(-(*idum) < 1) *idum =1;
    else *idum = -(*idum);
    for (j=NTAB +7;j>=0; j--){
      k=(*idum)/IQ;
      *idum=IA*(*idum-k*IQ)-IR*k;
      if (*idum < 0) *idum += IM;
      if( j < NTAB) iv[j]=*idum;
    }
    iy=iv[0];
  }
  k=(*idum)/IQ;
  *idum=IA*(*idum-k*IQ)-IR*k;
  if (*idum < 0) *idum += IM;
  j=iy/NDIV;
  iy=iv[j];
  iv[j]= *idum;
  if((temp=AM*iy) > RNMX) return RNMX;
  else  return temp;
}


出力結果

1000回(平均が0付近)


しかし回数(100000回)を増やすと、平均は0ではない。
ある人はバブルだと言うかもしれない。


もっと回数(10000000回)を増やすと、今度は下に。
ある人はバブル崩壊の影響を表しているというかもしれない。

/*
2-dimensional Random Walk

*/

#include 
#include 
#include 

#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

unsigned long int idum =1024;

float ran1(long *);

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

main(void)
{
  coordinate point = {0, 0};
  double rn=0.0;
  int i=0;

  for (i=0;i<1000000;i++)
    {
      rn=ran1(&idum);

      if (rn < 0.25)
	point.x++;
      else if (rn >= 0.25 && rn<0.5)
	point.x--;
      else if (rn >= 0.50 && rn<0.75)
	point.y++;
      else
	point.y--;

      printf("%d %d\n", point.x, point.y);
    }
  return (0);
}

float ran1(long *idum)
{
  int j;
  long k;
  static long iy=0;
  static long iv[NTAB];
  float temp;
  
  if(*idum <= 0 || !iy){
    if(-(*idum) < 1) *idum =1;
    else *idum = -(*idum);
    for (j=NTAB +7;j>=0; j--){
      k=(*idum)/IQ;
      *idum=IA*(*idum-k*IQ)-IR*k;
      if (*idum < 0) *idum += IM;
      if( j < NTAB) iv[j]=*idum;
    }
    iy=iv[0];
  }
  k=(*idum)/IQ;
  *idum=IA*(*idum-k*IQ)-IR*k;
  if (*idum < 0) *idum += IM;
  j=iy/NDIV;
  iy=iv[j];
  iv[j]= *idum;
  if((temp=AM*iy) > RNMX) return RNMX;
  else  return temp;
}




/*
random walk の原点からの距離。
*/

#include 
#include 
#include 

#define Num 100000
#define Num2 600

/*Random Number*/
#define IA 16807
#define IM 2147483647
#define AM (1.0/IM)
#define IQ 127773
#define IR 2836
#define NTAB 32
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

unsigned long int idum =1024;

float ran1(long *);

main()
{
 int i,y=0,rank,rank2,histo2[Num2+1],histo[Num2+1],rw[Num+1];
 double a[Num+1];

 for (i=0;i<=Num2;i++){
   histo[i]=0;
   histo2[i]=0;
  }

for (i=0;i<Num;i++){
   a[i]=0.0;
   rw[i]=0;
}

 for (i=0;i<Num;i++){
    a[i]=ran1(&idum);

/*Random Walk*/
          if (a[i] >= 0.50){
       	y++;
 		}
          else {
	         y--;
                 }
	rw[i]=y;
    }

 /*for (i=0;i<Num;i++){
     printf("%d %d\n", i, rw[i]);
      }*/

 for (i=0;i<Num;i++){
    rank=rw[i];

    if (rank>=0)
      histo[rank]++;
    else {
      rank2=-rank;
      histo2[rank2]++;
      }
    }

  for(i=0;i<Num2;i++)
     /*printf("%d %d\n",  i, histo[i]);*/
     printf("%d %d\n",  -i, histo2[i]);
}

/*random number*/
float ran1(long *idum)
{
  int j;
  long k;
  static long iy=0;
  static long iv[NTAB];
  float temp;
  
  if(*idum <= 0 || !iy){
    if(-(*idum) < 1) *idum =1;
    else *idum = -(*idum);
    for (j=NTAB +7;j>=0; j--){
      k=(*idum)/IQ;
      *idum=IA*(*idum-k*IQ)-IR*k;
      if (*idum < 0) *idum += IM;
      if( j < NTAB) iv[j]=*idum;
    }
    iy=iv[0];
  }
  k=(*idum)/IQ;
  *idum=IA*(*idum-k*IQ)-IR*k;
  if (*idum < 0) *idum += IM;
  j=iy/NDIV;
  iy=iv[j];
  iv[j]= *idum;
  if((temp=AM*iy) > RNMX) return RNMX;
  else  return temp;
}




10000ステップのRWにおける原点からの距離。 正規分布にならない。



100000ステップのRWにおける原点からの距離。 正規分布にならない。


Back to C Language

Google




BLOG
PICASAWEB
Panoramio


REF:

Principles of Random Walk (Graduate Texts in Mathematics)

ランダム・ウォーク―乱れに潜む不思議な現象

ランダムウォークと確率解析

図解でわかる ランダムウォーク&行動ファイナンス理論のすべて