ページ 11

for文の重複とprintfの表示について

Posted: 2008年9月22日(月) 20:15
by シルト
初めまして。
粒子の流れを記述するプログラムを作りたいのですが、上手くいきません。

作りたいのは、一次元のサイト(マス)と粒子が左右に移動するモデルの時間発展を記述するプログラムです。両方の端からは粒子が流入、流出するようにしてあり、粒子数は一定ではありません。
サイトの間の壁(端も含む)を乱数で指定して、その左右の粒子を動かすようにしました。1が粒子がいる状態、0が粒子がない状態です。1Stepで全ての壁を一回ずつ指定して、それを10Step繰り返すようにしたいです。

この時、乱数で同じ壁を指定してしまう時があります。図で言えば[/url]の部分の重複を無くしたいです。
また、各ステップの最後だけをprintしたいです。しかし、両方上手くいかないので何かアドバイスを頂けないでしょうか?よろしくお願いします。


STEP 0
[5]:100011000
[2]:100011000
[0]:100011000→ここの[/url]の重複をなくしたい
[6]:100010100
[9]:100010100
[0]:100010100→ここの[/url]の重複をなくしたい
[4]:100100100
[3]:100100100
[9]:100100100
[2]:100100100→各Stepのこの行をプリントしたい。




+プログラム+

// Model.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[/url])
{

#define LAT_MAX 10
#define IV_DENS 40 //initial value of existence density

#define STEP 10 //step times

#define HR_L 60 //establishment of hop left
#define HR_R 100 //establishment of hop right
#define HR_IN 60 //establishment of boundary condition(IN)
#define HR_OUT 100 //establishment of boundary condition(OUT)


int lat[LAT_MAX];
bool q[LAT_MAX-1]={false};


srand((unsigned)time(NULL));

for(int i2=0; i2<STEP; i2++)
{

printf("STEP %d",i2);
printf("\n");

for(int i1=0; i1<LAT_MAX; i1++)
{ lat[i1]=rand()%(LAT_MAX); }

for(int i1=0; i1<LAT_MAX-1; i1++)//set existence density
{
if(IV_DENS < rand()%(100+1)){ q[i1]=0; }else{ q[i1]=1; }
}





for(int i1=0; i1<LAT_MAX; i1++)// one step
{
if(lat[i1]==0){ // boundaly condition of IN
if ( (q[lat[i1]]==0) ){
if(HR_IN >= rand()%(100+1)){ q[lat[i1]] =1; }
}else if( (q[lat[i1]]==1) ){
}
}else if( lat[i1]==(LAT_MAX-1) ){ // boundaly condition of OUT
if ( (q[lat[i1]-1]==0) ){
}else if( (q[lat[i1]-1]==1) ){
if(HR_OUT >= rand()%(100+1)){ q[lat[i1]-1] =0; }
}
}else{ // normal hop

if ( (q[lat[i1]-1]==0)&&(q[lat[i1]]==0) ){
}else if( (q[lat[i1]-1]==1)&&(q[lat[i1]]==1) ){
}else if( (q[lat[i1]-1]==1)&&(q[lat[i1]]==0) ){
if(HR_R >= rand()%(100+1)){
q[lat[i1]-1]=0;
q[lat[i1]] =1; }

}else if( (q[lat[i1]-1]==0)&&(q[lat[i1]]==1) ){
if(HR_L >= rand()%(100+1)){
q[lat[i1]-1]=1;
q[lat[i1]] =0; }

}

}


printf("[%d]:",lat[i1]);
for(int i5=0; i5<LAT_MAX-1; i5++)
{ printf("%d",q[i5]); }
printf("\n"); //line break

}



}






return 0;
}

Re:for文の重複とprintfの表示について

Posted: 2008年9月23日(火) 00:45
by 管理人
つまり、重複した並びは表示したくないということですね。

それなら今調べている並びが、終わりの並びじゃない時、
次に並んでいる並びと異なっていたら表示したらいいのではないでしょうか。

サンプルを書いておきます。

#include <stdio.h>
#define X 6
#define Y 6
int q[Y][X]={
	{0,0,0,1,1,1},//0
	{0,0,0,1,1,1},//1
	{0,1,0,1,1,1},//2
	{0,0,0,1,1,1},//3
	{0,0,0,0,0,1},//4
	{0,0,0,0,0,1},//5
};
int main(){
	int i,s;
	for(s=0;s<Y;s++){//全部ループ
		if(s<Y-1){//最後じゃない時
			for(i=0;i<X;i++){//1行分ループ
				if(q!=q[s+1])//1つでも次の要素と違えば
					break;
			}
		}
		else
			i=(!X);//下のif文の条件文を真にする
		if(i!=X){//先ほど1つでも違うものがあれば表示
			printf("%d:",s);
			for(i=0;i<X;i++){
				printf("%d",q);
			}
			printf("\n");
		}
	}
	return 0;
}

実行結果

1:000111
2:010111
3:000111
5:000001

 
qを見ると、うまく実行結果が重複をさけて重複した最後だけ表示しているのがわかると思います。
こういうことでしょうか?

Re:for文の重複とprintfの表示について

Posted: 2008年9月23日(火) 15:33
by シルト
管理人さんへ、アドバイスありがとうございます。
重複を表示したくないというより、重複しないようにしたいです。
{0,0,0,1,1,1},//0
{0,0,0,1,1,1},//1
{0,1,0,1,1,1},//2
{0,0,0,1,1,1},//3
{0,0,0,0,0,1},//4
{0,0,0,0,0,1},//5
この場合0,1,2,3,4,5を全て一回ずつランダムで動かしその最後だけを表示したい、という事です。
しかし今の場合、全て一回ずつではなく、同じものが複数出てしまうので、それを除く方法が分からないです。
質問をするのが初めてなので、分かりづらいかもしれませんが、よろしくお願いします。