티스토리 뷰
#include<iostream>
#include<cstdlib>
#include<time.h>
#include<Windows.h>
using namespace std;
class Rnd// 랜덤숫자를 만드는 클레스
{
private:
int start;
int end;
public:
Rnd()
{
start =0;end = 9;
}
void setRange(int pStart, int pEnd)
{
start = pStart;
end = pEnd;
}
int getRNumber()
{
int rn = (int)( (rand() % (end-start+1)) + start );
return rn;
}
};
class SEQ_R//SEQ-R에대한 클래스
{
private:
int num; // 채널 개수
int a; // 노드 개수
int* numarr; // 채널 배열
int* node; // 노드 배열
public:
SEQ_R(int x)
{
num=x; // 사용자가 입력한 숫자를 클레스에 입력한다.
}
~SEQ_R()
{
delete[] numarr;
delete[] node;
}
void seq_rSet()
{
int i,j,k;
int x;
Rnd R;
numarr = new int[num];
a = num*(num+1); // 내가 입력한 숫자를 가지고 배열을 동적 할당한다.
node = new int[a];
R.setRange(1,num);
for(i=0; i<num ; i++)//중복없이 사용자가 입력한수를 배열에 넣는다.
{
x = R.getRNumber();
numarr[i] = x;
for(j=0 ; j<i ; j++)
{
if(numarr[j] == x)
{
i--;
break;
}
}
}
for(i=0,k=0 ; i<a,k<num ; i++,k++)//랜덤으로 뽑은 배열을 가지고 SEQ-R 노드를 만든다.
{
node[i] = numarr[k];
for(j=0 ; j<num ; j++,i++)
{
if(j==0)
{
i++;
node[i]=numarr[j];
}
else
{
node[i]=numarr[j];
}
}
i--;
}
}
void print()//기본노드를 출력한다
{
int i;
for(i=0 ; i<a ; i++)
{
cout << " " << node[i];
}
cout << "\n";
}
int nodecompare()//SEQ-R에 대하여 두개의 노드를 만든뒤에 비교한다.
{
Rnd R;
int i,j,k;
int startTime1=0;//노드1번 배열의 시작점
int startTime2=0;//노드2번 배열의 시작점
int rendezvousTime=0; // 얼마나 걸렸는지 확인후 반환값
int* ST1arr;
int* ST2arr;
ST1arr = new int[a];
ST2arr = new int[a];
R.setRange(1,a-1);// 시작점의 범위를 설정
startTime1 = R.getRNumber();//노드1의 시작점 램덤으로 설정
startTime2 = R.getRNumber();//노드2의 시작점 랜덤으로 설정
for(i=0, j=startTime1 ,k=startTime2 ; i<a,j<a,k<a ; i++,j++,k++) // 노드1,2의 배열 설정
{
ST1arr[i]=node[j];
ST2arr[i]=node[k];
if(j==a-1)
{
j=-1;
}
if(k==a-1)
{
k=-1;
}
if(i==a)
{
break;
}
}
for(i=0 ; i<a ; i++)
{
if(ST1arr[i] == ST2arr[i])
{
rendezvousTime = i+1;
break;
}
}
return rendezvousTime;
}
};
class DRSEQ
{
private:
int num; // 채널 개수
int a; // 노드 개수
int* numarr; // 채널 배열
int* node; // 노드 배열
public:
DRSEQ(int x)// 사용자의 채널의 갯수를 입력받는다.
{
num=x;
}
~DRSEQ()
{
delete[] numarr;
delete[] node;
}
void drseqSet()
{
int i,j;
int e=0; // e에 해당
Rnd R;
numarr = new int[num];
a = num*2+1;// 동적 배열의 갯수를 설정한다.
node = new int[a];
R.setRange(1,num);
e=R.getRNumber(); // e에 해당,e에는 난수를 넣는다.
for(i=0,j=1; i<num ; i++,j++)//numarr에 채널숫자를 순서대로 입력한다.
{
numarr[i] = j;
}
for(i=0 ; i<num ; i++)//node에 1~채널수 까지 입력한다.
{
node[i] = numarr[i];
}
node[i] = e;//채널수 입력다음 e(난수)를 입력한다.
i++;
for(j=num-1 ; j>=0 ; i++,j--)//node에 채널수~1까지 반대로 입력한다.
{
node[i] = numarr[j];
}
}
void print()//기본노드를 출력한다.
{
int i;
for(i=0 ; i<a ; i++)
{
cout << " " << node[i];
}
cout << "\n";
}
int nodecompare()// 시작점이 다른 두노드를 서로 비교한다.
{
Rnd R;
int i,j,k;
int startTime1=0;//노드1번의 시작점
int startTime2=0;//노드2번의 시작점
int rendezvousTime=0;//몇번째레 같아지는지 반환값
int* ST1arr;
int* ST2arr;
ST1arr = new int[a];
ST2arr = new int[a];
R.setRange(1,a-1);//시작점 범위설정
startTime1 = R.getRNumber();//노드1의 시작점 램덤으로 설정
startTime2 = R.getRNumber();//노드2의 시작점 랜덤으로 설정
for(i=0, j=startTime1 ,k=startTime2 ; i<a,j<a,k<a ; i++,j++,k++) // 노드1,2의 배열 설정
{
ST1arr[i]=node[j];
ST2arr[i]=node[k];
if(j==a-1)
{
j=-1;
}
if(k==a-1)
{
k=-1;
}
if(i==a)
{
break;
}
}
for(i=0 ; i<a ; i++)
{
if(ST1arr[i] == ST2arr[i])
{
rendezvousTime = i+1;
break;
}
}
return rendezvousTime;
}
};
int main(void)
{
int x;
int i;
int seqr=0;
int Ssum=0;
double Savr=0.0;
int dresq=0;
int Dsum=0;
double Davr=0.0;
srand((unsigned int)time(NULL));
cout << "채널의 개수를 선택하세요<3~10>: ";
cin >> x;
SEQ_R s(x);
s.seq_rSet();
DRSEQ d(x);
d.drseqSet();
cout << "SEQ-R 시퀸스: " ;
s.print();
cout << "DRSEQ 시퀸스 : ";
d.print();
for(i=1 ; i<1001 ; i++)
{
seqr=s.nodecompare();
dresq=d.nodecompare();
cout << "[" << i << "번째 시도] <SEQ-R, DRSEQ>=<"<<seqr<<","<<dresq<<">"<<endl;
Ssum = Ssum + seqr;
Dsum = Dsum + dresq;
}
Savr = Ssum / 1000.0;
Davr = Dsum / 1000.0;
cout << "SEQ-R 만나는데 걸리는 평균 : "<< Savr<<endl;
cout << "DRESQ 만나는데 걸리는 평균 : "<< Davr<<endl;
return 0;
}
■ 체널 랑데부 프로그램 개요
1. 채널의 개수 선택
2. SEQ-R 및 DRSEQ 시퀸스 출력
3. SER-R 및 DRSEQ의 start time에서 end time까지의 시간
rendezvous time 1000회를 측정 및 출력
4. 평균 만나는데 걸리는 시간 각각 출력
■ 구현한 클레스 설명
● Rnd 클래스는 설정한 범위 중 숫자를 난수 생성하는 기능을 가진 클래스이다.
1. 기본 생성자
- 0~9 까지 범위 초기화
2. void setRange(int pStart, int pEnd)
- 범위를 pStart~pEnd까지 설정한다.
3. int get RNumber()
- rand함수로 난수를 생성한다.
● SEQ_R 클래스는 매개변수 생성자, 소멸자, seq_rSet(), print(),
nodecompare()로 구성 되어있다.
1. 매개변수 생성자
- 사용자가 입력한 채널의 개수를 SEQ_R 클래스에 저장한다.
2. 소멸자
- 동적할당 받은 변수를 delete 시켜준다.
3. void seq_rSet()
- SEQ-R 채널 랑데부 노드를 배열에 저장시킨다.
4. void print()
- SEQ-R 채널 랑데부 노드를 배열을 출력한다.
5. int nodecompare()
- 만들어 놓은 채널 랑데부 노드를 시작점을 달리해서 두개의 노드를 만든다.
그리고 두 노드를 비교해서 언제 만나는지 확인한 후 반환한다.
● DRSEQ클래스는 매개변수 생성자, 소멸자, dresqSet(), print(),
nodecompare()로 구성 되어있다.
1. 매개변수 생성자
- 사용자가 입력한 채널의 개수를 SEQ_R 클래스에 저장한다.
2. 소멸자
- 동적할당 받은 변수를 delete 시켜준다.
3. void dresqSet()
- DRESQ 채널 랑데부 노드를 배열에 저장시킨다.
e 는 랜덤으로 입력해서 확률을 높인다.
4. void print()
- DRESQ 채널 랑데부 노드를 배열을 출력 시킨다.
5. int nodecompare()
- 만들어 놓은 채널 랑데부 노드를 시작점을 달리해서 두개의 노드를 만든다.
그리고 두 노드를 비교해서 언제 만나는지 확인한 후 반환한다.
■ 메인함수
- 채널의 개수를 입력 받아 클래스에 입력한다
- 1000회 동안 걸리는 시간을 계산에서 평균을 출력한다.
■ 프로그램 실행

'IT > Back-end' 카테고리의 다른 글
[C++] Bingo game 빙고게임 (0) | 2022.03.28 |
---|---|
[C++] RFID 충돌방지기법, 질문트리 프로토콜 (0) | 2022.03.28 |
[C++] 무선 링크 및 개수 구하기 (0) | 2022.03.28 |
JPA와 JDBC ? (0) | 2021.04.04 |
c++과 JAVA(자바) 차이점? (0) | 2021.03.27 |