ページ 1 / 1
ランダムウォーク
Posted: 2007年6月12日(火) 13:30
by hana
こんにちは、はじめまして
今やってる課題で「ランダム粒子」に関するプログラムを作ってます。
最終的には100個の粒子が移動距離は不規則で動き回るものを目指してます。
今のところ、1個の粒子がxy座標上を±1ずつ移動するプログラムを作成しましたが
これを移動距離はそのまま±1で、粒子の数を100個に増やす方法が良くわかりません。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (void)
{
int i,num0;
int m=0;
int n=0;
double x[10000];
double y[10000];
srand((unsigned)time(NULL));
for(i=0;i<10000;i++){
num0=rand()%4;
switch(num0){
case 0: m=m+1; break;
case 1: m=m-1; break;
case 2: n=n+1; break;
case 3: n=n-1; break;
}
x=m;
y=n;
printf("x=%.0f\t",x);
printf("y=%.0f\n",y);
}
}
for文を使えばいいと思うのですが、どなたか教えてください。
Re:ランダムウォーク
Posted: 2007年6月12日(火) 13:47
by asd
掲載されているプログラムでx,yを10000の配列にしているところから、
10000個分のXY座標を保存できる=10000個の粒子の座標を保存できると考えたのですが違うのでしょうか?
(粒子100個ならそれぞれ100にすればいいのでは?)
現状のプログラムでは初期位置が全て(0,0)となってしまうため、
for文に入る前にそれぞれの初期座標をランダムに決定する処理を追加すると1箇所に固まらずばらばらになるかと思います。
また、for文全体を無限ループするようにすれば終了させるまで延々と粒子が動いてくれるかと思います。
大きな勘違いをしていたらゴメンナサイ。
Re:ランダムウォーク
Posted: 2007年6月12日(火) 14:29
by keichan
こんな感じでしょうか?
[color=#0000ff">#include[/color]<stdio.h>
[color=#0000ff">#include[/color]<stdlib.h>
[color=#0000ff">#include[/color]<time.h>
[color=#0000ff">#define[/color] X_LIMIT (200)
[color=#0000ff">#define[/color] Y_LIMIT (200)
[color=#0000ff">#define[/color] PARTICLE_NUM (100)
[color=#0000ff">int[/color] main (void)
{
int i, num0;
double x[PARTICLE_NUM];
double y[PARTICLE_NUM];
srand(([color=#0000ff">unsigned[/color])time(NULL));
/* 初期位置の設定 */
[color=#0000ff">for[/color]( i=0; i<PARTICLE_NUM; ++i ) {
x = rand() % X_LIMIT;
y = rand() % Y_LIMIT;
}
[color=#0000ff">for[/color]( i=0; i<PARTICLE_NUM; ++i ) {
[color=#0000ff">switch[/color](rand() % 4) {
[color=#0000ff">case[/color] [color=#ff0000">0[/color]: x = x + [color=#ff0000">1[/color]; break;
[color=#0000ff">case[/color] [color=#ff0000">1[/color]: x = x - [color=#ff0000">1[/color]; break;
[color=#0000ff">case[/color] [color=#ff0000">2[/color]: y = y + [color=#ff0000">1[/color]; break;
[color=#0000ff">case[/color] [color=#ff0000">3[/color]: y = y - [color=#ff0000">1[/color]; break;
}
printf("x=%.0f\t",x[i]);
printf("y=%.0f\n",y[i]);
}
[color=#0000ff">return[/color] 0;
}
Re:ランダムウォーク
Posted: 2007年6月12日(火) 15:08
by hana
asdさん、返信ありがとうございます。
配列を10000個用意したのは、移動する粒子の(x、y)座標を格納して実行すると
コマンドラインで(x、y)の座標が出るようにするために準備したのですが・・・
もしかしてこれって必要ないのでしょうか?
keichanさん、ありがとうございます
まだ初心者で、defineは初めて見ました。
調べてみたら「べんり~♪」って感じになりました。
このプログラムでは移動回数は100回で設定!でいいんですよね
実行後の結果というのは、100個の粒子各々の最終的な座標になるのですか?
Re:ランダムウォーク
Posted: 2007年6月12日(火) 18:34
by asd
>配列を10000個用意したのは、移動する粒子の(x、y)座標を格納して実行すると
>コマンドラインで(x、y)の座標が出るようにするために準備したのですが・・・
>もしかしてこれって必要ないのでしょうか?
それぞれの粒子の移動履歴を取っておきたいということであれば必要かと思いますが、
一度座標を表示したらそれ以降値が変化してもいいのであれば配列にしなくてもよいかと思います。
私が言わんとしたことはkeichanさんが形にしてくれていますのでそれを参考にすると良いかと思います。
そしてhanaさんのコメントで気がついたことがあるのですが、
>このプログラムでは移動回数は100回で設定!でいいんですよね
keichanさんのプログラムでは100個の粒子がそれぞれ1回だけ移動した結果を表示するものかと思います。
配列x,yはそれぞれの粒子のX座標、Y座標を保存している配列になります。
図にするとこんなかんじです。
[0] [1] [2] ... [98] [99]
X 200 105 10 ... 10 123
Y 10 5 2 ... 51 54
上の図から、それぞれの粒子の座標は以下になります。
粒子0(200,10)
粒子1(105,5)
粒子2(10,2)
(中略)
粒子98(10,51)
粒子99(123,54)
ですので移動回数を2回以上にする場合にはfor文を繰り返し実行する必要があります。
/*粒子を無限に移動させる*/
while(1){
/*それぞれの粒子を1度移動させる*/
for( i=0; i<PARTICLE_NUM; ++i ) {
switch(rand() % 4) {
case 0: x = x + 1; break;
case 1: x = x - 1; break;
case 2: y = y + 1; break;
case 3: y = y - 1; break;
}
printf("x=%.0f\t",x);
printf("y=%.0f\n",y);
}
}
何となく分かってもらえたでしょうか?
keichan様>
意図と違う説明をしていたら遠慮なく突っ込んでください^^
Re:ランダムウォーク
Posted: 2007年6月13日(水) 08:14
by hana
asdさん詳しい説明ありがとうございます
もう少し自分でkeichanさんとasdさんのソースコードを見て勉強させてもらいます.
また分からないときはよろしくお願いします.