목적
  - 난수를 만들고 생성 확률을 계산한다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main(void)
{
 srand((unsigned)time(0));
 rand();

 int iRand, i10, i20, i30, i40, i50, i;
 iRand = i10 = i20 = i30 = i40 = i50 = i = 0;

 while(i <= 100)
 {
  iRand = rand() % 5 + 1;
 
  switch(iRand)
  {
   case 1:
    i10++;
    break;

   case 2:
    i20++;
    break;

   case 3:
    i30++;
    break;

   case 4:
    i40++;
    break;

   case 5:
    i50++;
    break;

   default:
    break;

  }

  cout << iRand * 10 << "  ";
  i++;

 }

 cout << endl << endl << "10이 나올 확률 : " << i10 / 100.0 << endl;
 cout << "20이 나올 확률 : " << i20 / 100.0 << endl;
 cout << "30이 나올 확률 : " << i30 / 100.0 << endl;
 cout << "40이 나올 확률 : " << i40 / 100.0 << endl;
 cout << "50이 나올 확률 : " << i50 / 100.0 << endl;

 return 0;
}

해설
  - rand() % 5 을 통해 0 부터 4까지 + 1 을 통해 1 부터 6까지 출력합니다.
  - switch-case 문으로 확률을 더하고 출력은 10배를 하여 원하는 값을 만들어 냅니다.
  - 10 ~ 50 가 10의 단위로 나올 확률과 1 ~ 5 가 나올 확률은 동일합니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 난수 생성 및 조건문을 응용한다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstdlib>
#include <ctime>

int main(void)
{
 srand((unsigned)time(NULL));
 rand();

 float afIn[50] = {0};
 float fTotal = 0;
 int i, iUp, iDown;
 i = iUp = iDown = 0;

 for(i = 0; i < 50; i++)
 {
  afIn[i] = ((rand() % 2001) - 1000) / 1000.0;
  std::cout << afIn[i] << '\t';
  iUp = afIn[i] > 0 ? iUp + 1 : iUp;
  iDown = afIn[i] < 0 ? iDown + 1 : iDown;
  fTotal += afIn[i];

 }

 std::cout << std::endl;
 std::cout << "0 보다 큰 값의 수 : " << iUp << '\n';
 std::cout << "0 보다 작은 값의 수 : " << iDown << '\n';
 std::cout << "난수들의 평균 : " << fTotal / 50 << '\n';

 return 0;
}


해설
  - using namespace std; 를 쓰지 않을때에는 cout 앞에 보시다시피 std:: 라는 것을 붙여 넣으면 됩니다. std::endl 도 마찬가지 입니다.
  - 이전 문제에도 보다 시피 구간내에 난수를 만들어서 계산하는 문제였습니다. 과년도 문제에도 비슷한 유형이 많으니깐 눈여겨 보셔야 할 문제 입니다.
 - 삼항 연산자는 검색하여 찾아 보시기 바랍니다.

참고
  - 유사 문제

Posted by 카켈






목적
  - 난수를 만들어서 추측게임을 만든다.

문제
사용자 삽입 이미지

코드

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(void)
{
 srand((unsigned)time(NULL));
 rand();

 int i, iRan;
 iRan = i = 0;

 iRan = rand() % 10 + 1;

 while(iRan != i)
 {
  cout << "값을 입력하세요 : ";
  cin >> i;
  if(iRan > i)
   cout << "더 큰 값입니다." << endl << endl;
  if(iRan < i)
   cout << "더 작은 값입니다." << endl << endl;

 }

 if(iRan == i)
  cout << "맞추었습니다." << endl;

 return 0;
}

참고
  - 유사 문제

Posted by 카켈




목적
  - 특정 범위의 난수를 만들줄 안다.

문제

사용자 삽입 이미지


코드
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(void)
{
 srand((unsigned)time(NULL));
 rand();

 double afRand[30] = {0.0};
 double dTotal = 0.0;
 int i = 0;
 

 cout << "생성된 난수 : " << endl;
 while (i < 30)
 {
  afRand[i] = ((rand() % 2000) - 1000) / 1000.0;
  cout << afRand[i] << '\t';
  dTotal += (afRand[i] * afRand[i]);

  i++;
 }

 cout << endl << "난수의 제곱 합 : " << dTotal << endl;

 return 0;
}
해설
  - 원하는 범위의 난수를 만드는 방법은 (rand() % 원하는 값의 0 을 기준으로 최대값 - +- 중간값) / 자릿수의 역수
  - 마지막에 1000.0 으로 하지 않으면 int 형 나눗셈이 되어 버려서 int 형으로 전환 소숫점이 삭제되어 0이 출력됩니다.

참고
  - 유사 문제

Posted by 카켈




1. 목적

  - 배열의 동적 할당에 대해 이해한다.

2. 문제 (점수 : 15 점)
  - -50 ~ 100 사이의 임의이 값을 5만개 생성하여 배열에 저장하되 배열은 동적 메모리에 할당하여 사용하라.
  - 각 범위 ( -50~0 / 1~50 / 51~100 ) 에 따른 개수와 생성된 난수의 평균 또한 구하여라
  - 출력 화면

-50 ~   0 범위의 개수 : 16823 개
  1 ~  50 범위의 개수 : 16724 개
 51 ~ 100 범위의 개수 : 16453 개

생성된 난수의 평균 : 24.963620
Press any key to continue


3. 이해
  - 난수를 만들 줄 아는가?
  - 동적 할당에 대해 이해하고 생성할줄 아는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

 int *gen;
 int cMinus, cZero, cFifty, i;
 long total;
 total = cMinus = cZero = cFifty = i = 0;

 srand((unsigned)time(NULL));
 rand();

 gen = (int*)calloc(50000,sizeof(gen));

 while(i<50000)
 {
  gen[i] = (rand() % 151) - 50;
  total += gen[i];
  if(gen[i] >= -50 && gen[i] <= 0) cMinus++;
  if(gen[i] >= 1 && gen[i] <= 50) cZero++;
  if(gen[i] >= 51 && gen[i] <= 100) cFifty++;

  i++;

 }

 printf("-50 ~   0 범위의 개수 : %d 개\n",cMinus);
 printf("  1 ~  50 범위의 개수 : %d 개\n",cZero);
 printf(" 51 ~ 100 범위의 개수 : %d 개\n",cFifty);

 printf("\n생성된 난수의 평균 : %f\n",(float)total/50000);

 gen = NULL;
 free(gen);
 return 0;
}


5. 해설
  - 이전에 공부 한 것이 있어서 쉽게 동적 할당에 대해 접근 할수 있었습니다.
  - calloc 함수로 간단하게 생성했습니다. 보통은 malloc 을 씁니다만 초기화 때문에 calloc 을 썼습니다.
  - 마지막엔 NULL 에 맞추고 free 함수로 동적 할당된 자원을 반환 합니다. 그렇지 않으면 메모리 누수가 발생합니다. 요즘은 메모리 자원이 풍부하여 부족될 일은 자주 없지만 free 함수나 delete (C++) 로 비우는 에티켓이 필요합니다.

6. 참고
  - 유사 문제

Posted by 카켈




1. 목적
  - 난수 생성을 정확히 이해한다.

2. 문제 (점수 : 30 점)
  - -4.99 ~ 14.99 사이의 정수 50개를 출력하고 최대값과 최소값을 구하여라.
  - 출력 화면

생성된 난수 :      6.23    6.48    0.97    5.90   -4.82   -1.18   -3.05    5.32
   1.35   -3.78    1.50   13.14    6.66   -0.35   10.38   12.43   -4.26   12.50
   8.68   -2.89   14.23    2.65   14.47   -2.31    9.29    4.31    5.16    8.88
  -3.16   13.22    9.65    7.01   10.40    2.10    3.09   -0.28   11.39   12.97
   9.35   12.87   12.49    0.87    1.36   -4.49    9.71    1.28    9.29    1.88
   9.79    4.74
최대값 : 14.47
최소값 : -4.82
평  균 : 5.27
Press any key to continue


3. 이해
  - 난수를 특정 범위 내에서 원하는 갯수 만큼 만들줄 아는가?
  - 최대/최소/평균값을 이해하는가?

4. 코드

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
 int i = 0;
 float cal, max, min, total;
 cal = max = min = total = 0.0;

 srand((unsigned)time(NULL));
 rand();

 printf("생성된 난수 :\t");
  for(i = 0; i < 50; i++)
  {
   cal = (float)(rand() % 2000) / 100 - 5;
   printf("%7.2f\t", cal);

   max = max < cal ? cal : max;
   min = min > cal ? cal : min;
   total += cal;
   
  }

 printf("\n최대값 : %0.2f\n최소값 : %0.2f\n평  균 : %0.2f\n",max, min, total / 50);

 return 0;
}

5. 해설
  - 특정 범위를 구하는 난수 문제는 이전에도 많이 출제 되었습니다. rand() 링크를 클릭하세요.
  - 반복문은 for 문으로 하였습니다.
  - 최대/최소/평균값은 특별히 삼항 연산자 등으로 간단하게 구할수 있어 어렵지 않습니다.

6. 참고
  - 유사 문제
Posted by 카켈




1. 목적
  - 원하는 횟수 만큼 특정 범위의 난수를 난수를 만들줄 안다.

2. 문제 (점수 : 20 점)
  - 1부터 4까지의 정수를 가지는 난수를 100개 생성하여 그 확률을 출력하라
  - switch-case 문을 사용 하여라 (if-else 문 사용하지 말것)
  - 출력 화면

1이 나올 확률 : 0.230
2가 나올 확률 : 0.230
3이 나올 확률 : 0.180
4가 나올 확률 : 0.360
Press any key to continue

3. 이해
  - 난수 생성 원리를 아는가?
  - 필요한 확률을 출력할수 있는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 float one, two, three, four;
 int gen, i;
 one = two = three = four = 0.0;
 gen = i = 0;

 srand((unsigned)time(NULL));

 while(i<100)
 {
  gen = rand() % 4 + 1;
  switch(gen)
  { 
   case 1:
    one++;break;

   case 2:
    two++;break;

   case 3:
    three++;break;

   case 4:
    four++;break;

   default:
    break;

  }

  i++;
 }
 
 printf("1이 나올 확률 : %0.3f\n2가 나올 확률 : %0.3f\n3이 나올 확률 : %0.3f\n4가 나올 확률 : %0.3f\n", one/100, two/100, three/100, four/100);

 return 0;
}

5. 해설
  - switch-case 문을 써서 특정 확률을 계산 할수 있습니다.
  - float 형 자료를 써서 소숫점 출력을 할수 있습니다.
  - 100개가 계산 되기에 한번도 나오지 않을 확률을 0으로 했습니다. 나온다면 오류가 납니다.

6. 참고
  - 유사 문제

Posted by 카켈



1. 목적
  - 난수 생성을 할줄 안다.

2. 문제 (점수 : 40 점)
  - 컴퓨터가 생성한 1 ~ 10 사이의 임의의 번호를 맞추는 프로그램을 만들어라.
  - 힌트 : rand() % (최대 - 최소 + 1 ) + 최대
  - 입력 값을 확인하여 "크다" "작다" 의 응답을 확인해 줘야 한다.
  - 출력 화면

임의의 값을 생성 했습니다.

값을 예상해 보세요 : 4
더 작은 값 예상해 보세요

값을 예상해 보세요 : 3

정확히 맞추셨습니다. 생성한 값은 3 였습니다.
Press any key to continue

3. 이해
  - 난수를 해당 범위내에 입력을 시킬줄 아는가?
  - 크고 작음을 판단할 줄 아는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 int in, gen;
 in = gen = 0;
 srand((unsigned)time(NULL));
 gen = rand() % 10 + 1;
 puts("임의의 값을 생성 했습니다.\n");

 while(in != gen)
 {
  printf("값을 예상해 보세요 : ");
  scanf("%d", &in);
  printf(in < gen ? "더 큰값을 예상해 보세요.\n" : in > gen ? "더 작은 값 예상해 보세요\n" : "");
  putchar('\n');

 }

 printf("정확히 맞추셨습니다. 생성한 값은 %d 였습니다.\n", gen);

 return 0;

}

5. 해설
  - srand 함수로 rand 함수의 초기화를 했습니다.
  - 삼항 연산자로 대소 판정을 단순화 했습니다.
  - while 문으로 같을때 까지 반복 했습니다.

6. 참고
  - 삼항 연산자 문제
  - rand 내부 검색

Posted by 카켈




1. 목적
  - 무작위 숫자를 만들어 그 갯수를 확인한다.

2. 문제 (점수 : 40점)
  - 1부터 6사이의 임의의 정수 100개를 생성 각 숫자가 나타나는 확률을 계산하는 프로그램
  - 정수를 출력할 필요는 없다.
  - 중첩된 if-else 문 사용 / switch-case 문 사용 가능 (여기서는 switch-case 문으로 풀이)
  - 실행 화면

1 이 나올 확률 : 0.150
2 가 나올 확률 : 0.190
3 이 나올 확률 : 0.150
4 가 나올 확률 : 0.210
5 가 나올 확률 : 0.200
6 이 나올 확률 : 0.100
Press any key to continue


3. 이해
  - 원하는 범위의 난수를 잘 만들줄 아는가?
  - if-else / switch-case 문을 잘 활용할 줄 아는가?
  - 확률을 낼줄 아는가?

4. 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 
 int in = 0;
 int i = 0;
 int one = 0;
 int two = 0;
 int three = 0;
 int four = 0;
 int five = 0;
 int six = 0;

 srand((unsigned)time(NULL));
 
 while(i<100)
 {
  in = (rand() % 6) + 1;
  switch(in)
  {
   case 1:
    one++;
    break;

   case 2:
    two++;
    break;

   case 3:
    three++;
    break;

   case 4:
    four++;
    break;

   case 5:
    five++;
    break;

   case 6:
    six++;
    break;

   default:
    rand();

    break;

  }

  i++;
 }

 printf("1 이 나올 확률 : %0.3f\n", one == 0 ? 0 : (float)one/100 );
 printf("2 가 나올 확률 : %0.3f\n", two == 0 ? 0 : (float)two/100 );
 printf("3 이 나올 확률 : %0.3f\n", three == 0 ? 0 : (float)three/100 );
 printf("4 가 나올 확률 : %0.3f\n", four == 0 ? 0 : (float)four/100 );
 printf("5 가 나올 확률 : %0.3f\n", five == 0 ? 0 : (float)five/100 );
 printf("6 이 나올 확률 : %0.3f\n", six == 0 ? 0 : (float)six/100 );
 return 0;
}

5. 해설
  - 확률이 드물게 0 이 된다면 100으로 나눌때 오류가 나는걸 방지 하기 위해 간단한 조건문을 작성
    했습니다.
  - 선언된 변수가 int 형이기 때문에 출력시 소숫점 출력을 위해 float 형으로 형변환(casting)을 했습
    니다.
  - 0 ~ 32797 을 6으로 나눈 나머지 0 ~ 5 까지의 숫자에서 1을 더해 1 ~ 6 까지의 나올수 있는 숫자
    범위를 구했습니다.
  - if-else 문은 switch-case 문보다 더 자세한 경우를 다룰수 있지만 이 경우 처럼 숫자가 제한적
    인 경우 훨씬 세련된 코드로 보일수 있습니다.
  - srand((unsigned)time(NULL)) 구문은 첫부분에서 선언한 이상 추가 선언시 난수 생성시 예상치
    못한 경과가 생길수 있습니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/8-2-1.htm : rand() : 내부 검색
  - http://www.winapi.co.kr/clec/cpp1/9-3-4.htm : switch-case 구문

Posted by 카켈


1. 목적
  - 무작위 실수를 만들어 원하는 계산을 할줄 안다.

2. 문제 (점수 : 30점)
  - 임의의 실수 10개를 생성하여 평균을 계산하는 프로그램
  - 생성된 실수는 -10.0 ~ 10.0 사이의 값이어야 한다.
  - 프로그램 실행 후 모습

생성된 임의의 실수들 :
0.7 -7.1 8.6 8.8 10.6 10.3 4.9 1.5 -3.2 0.5
평균 : 3.560000
Press any key to continue

3. 이해
  - 원하는 범위 내의 무작위로 만들어진 숫자를 담을수 있는가?
  - 평균을 낼수 있는가?

4. 코드

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
 int i = 0;
 float in[10] = {0};
 float total = 0;
 
 srand((unsigned)time(NULL));
 rand();

 puts("생성된 임의의 실수들 : ");
 while(i<10)
 {
  in[i] = ((rand() % 200) - 100.0f) / 10;
  total += in[i];
  printf("%0.1f ",in[i]);
  i++;

 }

 printf("\n평균 : %f\n",total / 10);
 
 return 0;

5. 해설
  - 최소 -10.0 최대 10.0 을 만들기 위해 32767 % 200 => (0.0 ~ 200.0) / 10 => 0.0 ~ 20.0 - 10 =>
   -10 ~ 10.0 까지 나오는 난수 알고리듬을 작성합니다.
  - 짧은 코드를 위해 만들어진 난수는 이내 저장되며 합계에 저장시킵니다.

6. 참고
  - 내부 검색 : rand() 함수

Posted by 카켈
이전페이지 1 다음페이지