/* 一次元のランダムウォーク WIDTH を正の定数とする。ある点が、位置 WIDTH から出発して、0 と 2 * WIDTH の間をランダムに動く。具体的には、単位時間に、確率 1/2 で負の 方向へ 1 だけ、確率 1/2 で正の方向へ 1 だけ動く。 その様子を、縦軸に時刻、横軸に位置をとって示すもの。「g」の字が、蟻 (アリ)の行列のように画面に並ぶ。 位置の、画面上の数値による表示では、WIDTH を引くことで、0 ... 2 * WIDTH ではなく -WIDTH ... WIDTH として表示する。 速すぎるとおもしろくないので、時間かせぎのための空(から)ループを 設けてある。 位置が範囲からはずれればプログラムは終了する。 (画面制御エスケープシーケンスは使っていない。) */ #include #include /* rand() */ #include /* time() */ #define WIDTH 50 /* 動く範囲(横幅)の約半分。適当に変えて構いません */ main() { int i, j; int x; /* 位置 */ int count; /* 何ステップ目かを示す数 */ { /* この中カッコの中(乱数の種の設定)はわからなくてもよい */ unsigned seed = (unsigned)time(NULL); /* 現在時刻を取得して */ printf("乱数の種は %u です.\n", seed); srand(seed); /* それを乱数の種に */ } count = 0; for (x = WIDTH; x >= 0 && x <= 2 * WIDTH; count++) { printf("%6d %3d ", count, x - WIDTH); /* 次から、点のプロットが始まる */ printf("|"); /* 左端の枠 */ for (i = 0; i < x; i++) { printf(" "); } printf("g"); /* これが点。「g」は蟻に似ている */ for (i = x; i < 2 * WIDTH; i++) { printf(" "); } printf("|\n"); /* 右端の枠を書いて、これでプロット終了 */ if (rand() % 2 == 0) { /* 発生させた乱数が偶数か奇数かによって */ x--; /* 左か */ } else { x++; /* 右へ */ } for (i = 0; i < 5000; i++) { /* 時間かせぎの空ループ。回数は */ for (j = 0; j < 5000; j++) { /* マシンによって適宜調整して */ ; /* ください。(二重ループにして */ } /* あるのは、int 型の最大値が */ } /* 32767 のマシンがあるから。) */ } }