うまく処理がされない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
slip

うまく処理がされない

#1

投稿記事 by slip » 14年前

銀行のシュミレーションとして、窓口2つの銀行で待ち行列は1つの場合のプログラムを作っているのですが、まだ途中経過ですが、実行結果が予想外の結果になってしまいました。
while文でcurrent_time<360の間ループして処理をするはずなのですが、current_timeが360以上になっていないのに、処理が終了してしまいます。
何が、いけないのでしょうか?もし宜しければ、アドバイスよろしくお願いします。

codeタグをご利用ください。 投稿前にはプレビューで確認を。 by softya(ソフト屋)

コード:

#include<stdio.h> 
#include<math.h>
#include<stdlib.h>
double exprand(double t,double r);
int main (void)
{
	int count=2,fake_time,counter1=0,counter2=0,time=0,i=0,a=12869,c=6925;
        int y,current_time=0,current_time1,current_time2; /*来店時間変数*/
	int m=1,se_avg,x,x1; /*サービス時間変数*/
	int* pt;
	int* pt1;
	int* pt2;
	int* pt3;
        double  y1,y2,r,come_time=0,co_ave=0; /*来店時間変数*/     
        double  r1,r2,z1,z2,z3,service_time=0; /*サービス時間変数*/        
		
		x=1;
		x1=1111;
		se_avg=5;
		
		y=12;
		co_ave=3;

		pt = (int*)calloc(i, sizeof(int)); /*窓口1の到着時間間隔*/
		pt1 = (int*)calloc(i, sizeof(int));/*窓口1のサービス時間間隔*/
		pt2 = (int*)calloc(i, sizeof(int));/*窓口2の到着時間間隔*/
                pt3 = (int*)calloc(i, sizeof(int));/*窓口2のサービス時間間隔*/
				
				y1=(a*y+c)%16384;		/*来店時間間隔乱数生成*/	
				y=y1;		
				y2=y1/16384;
				r=((1/(1/co_ave)) * -log(y2));		
				come_time=come_time+r;
				printf("r=%f\n\n",r);
				r=(int)r;
				*(pt+i)=r;
				
				
	while(current_time < 360){

			printf("current_time=%d\n",current_time);	
			
			i++;	
				
		

			if(counter1==0 && counter2==1){ /*窓口1のみ空いている時*/
				counter1=1;
							
				
				r1=(a*x+c)%16384; 		/*サービス時間乱数生成*/
				r2=(a*x1+c)%16384;
			
				x=r1;
				x1=r2;

				r1=(r1/16384);			/*乱数を16384で除算し、[0,1]の範囲に*/
				r2=(r2/16384);
			
				z1=sqrt(-2.0*log(r1))*cos(2*3.141592653589793*r2); /*サービス時間*/
				z1=(z1*m+se_avg);		
				
				z2=sqrt(-2.0*log(r1))*sin(2*3.141592653589793*r2); /*サービス時間*/
				z2=(z2*m+se_avg);		
				
				z3=(z1+z2)/2;
				printf("z3=%f\n\n",z3);

				service_time=service_time+z3;
				current_time1=current_time-(time)+r;
				
				if(current_time1>current_time2){
				current_time=current_time1;
				
				counter2=0;
				}else if(current_time1<current_time2){
				current_time=current_time2;
				counter1=0;
				time=current_time-current_time1;
				}else{
				current_time=current_time1;
				counter1=0;
				counter2=0;
				}
				current_time1=current_time1+z3;

				y1=(a*y+c)%16384;		/*来店時間間隔乱数生成*/	
				y=y1;		
				y2=y1/16384;
				r=((1/(1/co_ave)) * -log(y2));		
				come_time=come_time+r;

				printf("r=%f\n\n",r);				
				r=(int)r;
				*(pt+i)=r;
				
				
		
				
				
			
		
		
			}else if(counter1==1 && counter2==0){ /*窓口2のみが空いている時*/

				counter2=1;

				r1=(a*x+c)%16384; 		/*サービス時間乱数生成*/
				r2=(a*x1+c)%16384;
			
				x=r1;
				x1=r2;

				r1=(r1/16384);			/*乱数を16384で除算し、[0,1]の範囲に*/
				r2=(r2/16384);
			
				z1=sqrt(-2.0*log(r1))*cos(2*3.141592653589793*r2); /*サービス時間*/
				z1=(z1*m+se_avg);		
				
				z2=sqrt(-2.0*log(r1))*sin(2*3.141592653589793*r2); /*サービス時間*/
				z2=(z2*m+se_avg);		
				
				z3=(z1+z2)/2;
				printf("z3=%f\n\n",z3);					
				service_time=service_time+z3;
				z3=(int)z3;
				current_time2=current_time+r;
				
				if(current_time1>current_time2+z3){
				current_time=current_time1;
				time=current_time-current_time2;
				counter1=0;
				}else if(current_time1<current_time2+z3){
				current_time=current_time2;
				counter2=0;
				
				}else{
				current_time=current_time1;
				counter1=0;
				counter2=0;
				}
				current_time2=current_time2+z3;

				y1=(a*y+c)%16384;		/*来店時間間隔乱数生成*/	
				y=y1;		
				y2=y1/16384;
				r=((1/(1/co_ave)) * -log(y2));		
				come_time=come_time+r;
				
				printf("r=%f\n\n",r);				
				r=(int)r;
				*(pt+i)=r;
				
				
				


			}else{  				/*窓口1、2共に空いている時*/

				
				r1=(a*x+c)%16384; 		/*サービス時間乱数生成*/
				r2=(a*x1+c)%16384;
			
				x=r1;
				x1=r2;

				r1=(r1/16384);			/*乱数を16384で除算し、[0,1]の範囲に*/
				r2=(r2/16384);
			
				z1=sqrt(-2.0*log(r1))*cos(2*3.141592653589793*r2); /*サービス時間*/
				z1=(z1*m+se_avg);		
				
				z2=sqrt(-2.0*log(r1))*sin(2*3.141592653589793*r2); /*サービス時間*/
				z2=(z2*m+se_avg);		
				
				z3=(z1+z2)/2;
				printf("z3=%f\n\n",z3);
				service_time=service_time+z3;
				z3=(int)z3;
				
				
				if(count%2==0){
				count++;
				counter1=1;
				current_time1=current_time1+r;

					if(current_time1>current_time2){
					current_time=current_time1;
					time=0;
					}else if(current_time1<current_time2){
					current_time=current_time2;
					time=0;
					}else{
					current_time=current_time1;
					}
				
				current_time1=current_time1+z3;
				
				}else{
				count++;
				counter2=1;
				current_time2=current_time2+r;

					if(current_time1>current_time2){
					current_time=current_time1;
					}else{
					current_time=current_time2;
					}
				
				current_time2=current_time2+z3;
				
				}

				
				

				y1=(a*y+c)%16384;		/*来店時間間隔乱数生成*/	
				y=y1;		
				y2=y1/16384;
				r=((1/(1/co_ave)) * -log(y2));		
				come_time=come_time+r;
				printf("r=%f\n\n",r);				
				r=(int)r;
				*(pt+i)=r;
				
				
				
				
			

			}
			
		
	printf("i=%d\n",i);
	printf("来店時間間隔=%f\n",come_time/i);
	printf("サービス時間=%f\n",service_time/i);
		
		
	

       }
	

	

	



  	return 0;
}

non
記事: 1097
登録日時: 15年前

Re: うまく処理がされない

#2

投稿記事 by non » 14年前

>int count=2,fake_time,counter1=0,counter2=0,time=0,i=0,a=12869,c=6925;
>pt = (int*)calloc(i, sizeof(int));

i=0 で、何をしたいのでしょうか?
non

初級者
記事: 200
登録日時: 15年前

Re: うまく処理がされない

#3

投稿記事 by 初級者 » 14年前

シュミレーションって書いている時点で、もうダメダメです。
シミュレーション(simulation)って書きましょう。

コピペしたかのようなコードが見受けられます。
設計をやり直してみましょう。

インデントに関するポリシーを感じることができません。
読みやすいコードを書くことを心がけましょう。

閉鎖

“C言語何でも質問掲示板” へ戻る