[C++ 언어-기초실습-13] 빈도수 구하기
[C++ 언어-기초실습-13] 빈도수 구하기
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
오늘의 주제는 빈도수를 구하는 실습니다. 빈도수를 구하는 방법은 해당 출현 수의 값을 누적시키는 방법을 이용합니다. 그러면 어떻게 빈도수가 누적되는지 알아볼까요.
1. 빈도수 구하기
특정 수가 얼마만큼 출현 하느냐를 나타내는 수를 빈도수라고 합니다. A라는 수가 몇번 출현하는지를 계산해 낼 수 있습니다.
이 계산 방법은 아래와 같습니다.
a[i]=a[i]+1;
i라는 출현수가 출현 할 때마다 1씩 증가하여 i라는 출현 수를 계속 누적하여 빈도수를 만들어 낼 수 있습니다.
예를 들어, 0~9까지의 빈도수를 구한다면 어떻게 할까요. a[0]~a[9]까지의 누적수를 구하면 됩니다.
0~9까지의 빈도수를 구할 때 무작위 수 10개를 0~9까지 만들어 내어 빈도수를 구한다면 아래와 같이 코딩 할 수 있습니다.
for(int i=0;i<10;i++){
m_buf=rand()%10; //0~9사이의 난수
m_sum[m_buf]+=1;
}
위와 같이 코딩을 하면 10개의 무작위 수의 빈도수를 구할 수 있습니다.
위 빈도수 구하는 식을 실제 결과가 어떻게 출력되는지 실습해 보도록 하죠.
2. 코딩
[전체소스]
#include <iostream>
#include <stdlib.h> //srand()
#include <time.h>
using namespace std;
int main(int argc, char** argv) {
int max_rand, m_buf;
int m_sum[10]={0};
srand((unsigned)time(NULL));
cout<<"난수 빈도수(0~9)를 구할 난수의 개수는? ";
cin>>max_rand;
for(int i=0;i<max_rand;i++){
m_buf=rand()%10;
m_sum[m_buf]+=1;
}
for(int i=0;i<10;i++){
cout<<"["<<i<<"] = "<<m_sum[i]<<endl;
}
return 0;
}
난수를 구하기 위해서는 다음과 같은 코딩이 필요합니다.
#include <stdlib.h> //srand()
#include <time.h>
srand((unsigned)time(NULL)); //난수초기화
rand()%10; //0~9 사이의 문자위 난수
이렇게 만들어진 난수를 for문으로 통해 원하는 개수만큼 난수를 만들어 내고 난수 0~9까지의 빈도수를 구할 수 있게 됩니다.
[결과]
마무리
오늘의 핵심은 빈도수를 구하기 위해 배열을 이용하고 배열의 index(위치) 수를 이용하여 해당 배열 공간에 1씩 누적하여 빈도수를 만들어 내는 것이 핵심입니다. 참고로 실습에서는 0~9까지의 예를 들었지만 빈도수가 특정 범위일 때가 있습니다. 가령 50~60사이라면 배열[60]까지 만들어서 누적을 시킬 필요 없이 배열[10]을 그대로 이용하고 50~60까지를 배열[0]~배열[10]에 매칭 시켜주어 빈도수를 구하면 됩니다.
이렇게 하면 50이상 60이하의 숫자가 출현 한다면 배열[10]은 다음과 같습니다.
m_buf=출현수-50;
m_sum[m_buf]+=1;
-50을 해줌으로 m_sum[0]은 50이라는 수의 빈도수에 해당 되어 해당 50~60상이의 빈도수를 구할 수 있습니다.
그리고, 빈도수 구하는 원리는 통계를 내는데 많이 사용함으로 잘 알아두시기 바랍니다. 나중에 영상처리에 대해 이야기 할 지 모르지만 이미지 칼러 RGB의 히스토 그램을 구할 때 0~255라는 색값의 빈도수를 구할 때가 있습니다. 이 빈도수를 나중에 시각적으로 표현하기 위해 히스토그램으로 차트이미지화 하는데 이부분을 이야기 할 날이 있으면 간단히 코딩을 설명하겠습니다.
암튼 빈도수 구하는 코딩은 통계에 관한 코딩을 하다보면 자주 사용하는 원리기 때문에 알아 두시면 좋습니다.
Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.
Thank you