for文の重複とprintfの表示について
Posted: 2008年9月22日(月) 20:15
初めまして。
粒子の流れを記述するプログラムを作りたいのですが、上手くいきません。
作りたいのは、一次元のサイト(マス)と粒子が左右に移動するモデルの時間発展を記述するプログラムです。両方の端からは粒子が流入、流出するようにしてあり、粒子数は一定ではありません。
サイトの間の壁(端も含む)を乱数で指定して、その左右の粒子を動かすようにしました。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;
}
粒子の流れを記述するプログラムを作りたいのですが、上手くいきません。
作りたいのは、一次元のサイト(マス)と粒子が左右に移動するモデルの時間発展を記述するプログラムです。両方の端からは粒子が流入、流出するようにしてあり、粒子数は一定ではありません。
サイトの間の壁(端も含む)を乱数で指定して、その左右の粒子を動かすようにしました。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;
}