목적
  -  특정 범위의 단위 정수 난수를 생성할줄 안다.

문제
사용자 삽입 이미지

코드

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

using namespace std;

int main()
{
 int i50, i60, i70, i80, i90, i, iRand;
 i50 = i60 = i70 = i80 = i90 = i = iRand = 0;

 srand((unsigned)time(0));
 rand();

 cout << "생성된 난수 :" << endl;

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

   case 1:
    i60++;
    break;

   case 2:
    i70++;
    break;

   case 3:
    i80++;
    break;

   case 4:
    i90++;
    break;

   default:
    break;

  }

  cout << (iRand + 5) * 10 << "  ";
  i++;

 }

 cout << "50이 생성될 확률 : " << i50 << endl
  << "60이 생성될 확률 : " << i60 << endl
  << "70이 생성될 확률 : " << i70 << endl
  << "80이 생성될 확률 : " << i80 << endl
  << "90이 생성될 확률 : " << i90 << endl;

 return 0;
}

해설
  - 예전 문제에서 범위만 바꾸어서 나온 것입니다. 0부터 시작하는 정수에서 확률을 계산해도 결과는 같다는 것을 이용했습니다.

참고
  - 유사 문제

Posted by 카켈



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

문제
사용자 삽입 이미지

코드

#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 카켈




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. 문제 (점수 : 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. 목적

  - 난수를 원하는 범위 내에서 원하는 형식으로 만들어 낸다.

2. 문제
  - 로또 번호 생성기를 만들어 낸다.
  - 로또 번호는 1 부터 45 까지 6개의 숫자가 한 세트 이다.
  - 엔터키를 치면 계속 나오게 설계 한다.
  - 코드 힌트
사용자 삽입 이미지

(예제 코드)
사용자 삽입 이미지
(수행결과)

  - 출력 화면

=================================================
 로또번호 생성기 [ENTER]를 치시면 계속 나옵니다.
=================================================
당첨번호 :    23  36  20   4  26  16
당첨번호 :    42  31  38  17   9  38
당첨번호 :     6   7  18  46  34  13
당첨번호 :     8   6   3  14  27  36
당첨번호 :    30  21  18  34  32  28
당첨번호 :    25  14   1  23  35  23
당첨번호 :    45  46  10  32   3  11
당첨번호 :    32  19   3  45  41  15
당첨번호 :    26  23  31  38  13  11
당첨번호 :    39   6  21   5   9  16
당첨번호 :    43  38  21   2  42  36
당첨번호 :     2  15  35  30   8  20
당첨번호 :    16  43  34  25  46   4

3. 이해
  - 난수를 원하는 범위 만큼 원하는 갯수 만큼 뽑아 낼수 있는가?
  - Enter 키를 누름으로 계속 반복할수 있게 할수 있는가?
 
4. 코드

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

int main()
{
 int lotto[6] = {0};
 int i, j, number;
 
 i = number = j = 0;

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

 printf("=================================================\n");
 printf(" 로또번호 생성기 [ENTER]를 치시면 계속 나옵니다.\n");
 printf("=================================================\n");
 do
 {
  printf("당첨번호 :  ");

  for(i = 0; i <= 5; i++)
  {
   number = rand() % 46 + 1;
   while(j <= 5)
   {
    if(lotto[j] == 0) break;

    if(lotto[j] == number)
     {
      srand((unsigned)time(NULL));
      number = rand() % 46 + 1;

      j = 0;
   
     }
    j++;
   }
   
   j = 0;
   lotto[i] = number;

  }

  j = 0;
 
  while(j <= 5)
  {
   printf("%2d ", lotto[j]);
   j++;
  }
 
  getchar();

 }while(1);
 
 return 0;
}

5. 해설
  - rand() 함수는 0 ~ 32767 까지 수를 무작위로 출력하는 함수입니다.
  - srand 함수는 rand() 함수가 계속 다른 난수를 뽑아 낼수 있게 만들어 주는 함수입니다.
    기준값을 시간으로 뒤서 계속 난수룰 뽑을수 있게 합니다.
  - while(1) 은 1이라는 조건 결과가 참이기 떄문에 계속 반복하게 할수 있습니다.
  - 기존 선발된 로또 번호를 검색하여 중복이 되면 다시 시작하여 검색하는 루틴이 있습니다.
  - 최적화를 위해 입력이 안된 부분 비교시 넘어가게 설계 되었습니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/8-2-1.htm : rand() 함수

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