본문으로 바로가기

[C언어] 표준함수

category C 2014. 5. 8. 22:23

C컴파일러에서 제공하는 함수들을 표준함수라 한다.
그중에서도 ANSI C 표준은 컴파일러의 종류에 상관없이 꼭 포함되어야하는 함수이다.

 

몇가지 기능별로 살펴보면 아래와 같다.

 

입출력 함수

printf, scanf, gets, puts, getchar, putchar, getch, putch, ...

파일 입출력 함수

fopen, fprintf, fscanf, fgetc, fputc, fgets, fputs, fseek, ftell, fwrite, fread, ...

수학 함수

sin, cos, tan, asin, acos, atan, sqrt, pow, log, exp, abs, floor, ceil,  

동적 메모리 함수

malloc, free, realloc, calloc

문자열 함수

strlen, strcpy, strcat, strcmp,

기타 함수

time, rand, srand, exit, system

 

등 무수히 많다.

파일 입출력 함수와, 동적 메모리 함수, 문자열 함수 등은 해당 시간에 자세히 살펴 보기로 한다.

 

그럼 난수를 발생시킬려면 어떻게 해야 할까?

 

먼저 난수의 뜻에 대해서 알아보자

 

난수 특정한 배열 순서나 규칙을 가지지 않는, 연속적인 임의의 수.

 

난수(random number)
① 기수가 n인 수에서 연속된 각 자릿수가 N개의 숫자 중에서 각각 같은 확률로 어느 하나를 선택하는 무작위 숫자. 예를 들면, 10진수 236에서 첫 번째 자릿수인 2는 0/9의 10개 숫자 중에서 10분의 1 확률로 2를 취하게 된 것이고, 3과 6도 마찬가지로 각각 10분의 1 확률로 얻어진 것이다.
② 난수표나 일련의 숫자로부터 선택된 여러 개의 자릿수로 구성된 수


pseudorandom a.【통계】 의사 난수(擬似亂數)의, 의사 무작위 추출의
   pseudorandom numbers 의사 난수
pseudo a. 허위의, 가짜의;모조의


의사난수 [ pseudo-random numbers, 擬似亂數, ぎじらんすう ]
난수발생기라 불리는 프로그램에 의해서 만들어진 일련의 숫자들. 일정한 절차에 따라 만들어지며 따라서 완전히 무작위적이지는 않기 때문에 '의사'(擬似)라는 말이 붙음.

 

의사 난수 [ PRN, pseudo-random number, 擬似亂數 ]
처음에 주어지는 초깃값을 이용하여 이미 결정되어 있는 메커니즘(의사 난수 생성기)에 의해 생성되는 수. 난수는 생성 방법이 결정되어 있지 않으며, 다음에 생성될 값을 전혀 예측할 수 없으나 의사 난수 생성기에 의해 생성되는 수는 초깃값을 알면 계산될 수도 있으므로 진짜 난수와 구별하여 의사 난수라 부른다.

 

C언어에서는 난수 생성을 위해 rand()함수를 사용한다.ㄴㅇ

 

<MSDN 참조>

rand

Generates a pseudorandom number.

 int rand( void );
Return Value
rand returns a pseudorandom number, as described above. There is no error return

Remarks

The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.

Required header

 <stdlib.h>
참고: RAND_MAX     0 ~ 0x7fff(32767)

 

srand
Sets a random starting point.

void srand(unsigned int seed);

Parameters

seed

Seed for random-number generation

Remarks

The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.

 

<예1>

#include <stdlib.h>
#include <stdio.h>
int main( void )
{
   int i;
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );
}


<예2>

#include <stdlib.h>
#include <stdio.h>
int main( void )
{
   int i;
   srand( 1 );
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );
}
<예3>

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

int main( void )
{
   int i;
   srand( (unsigned)time( NULL ) );
   for( i = 0;   i < 10;i++ )
      printf( "  %6d\n", rand() );
}

<예4>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    srand( (unsigned)time( NULL ));

    int iNum;
    for (;;)//int i = 0; i < 10; ++i)
    {
         iNum = rand();
         if (iNum >= 32767)
             break;
         printf("%d\n", iNum);
    }
    printf("%d\n", iNum);
}

 

01234
3841454851
77191846729216719617945
21238633424198929427159
243726500177959091386
88551916929484703117345
1179715724196502357727504
836511478145901770220815
3228529358264312350320576
1045026962107052721710960
306122446418316121686020
58535705555754095261
2810028145281892823328277
11422328112652202324162
2811682760617152930
205379961321532157811002
1592149117829239919737
89452995298132386317913
262851194230367160251682
299748276658848910319
146805436289611971810474

 

<생각해보기>

주사위는 1~6까지의 숫자가 나온다.

rand() 함수를 이용해서 주사위의 숫자를 만들어보자

<실습>

1~100 까지 숫자중 임의의 숫자를 생성하고

사용자에게 임의의 숫자를 맞추게 하는 게임이다.

입력한 수가 크면 "입력한 수가 큽니다." 출력

입력한 수가 작으면 "입력한 수가 작습니다." 출력

 

1회~  5회에 정답이 나오면 "정답입니다. Exellent" 출력

     ~10회에 정답이 나오면 "정답입니다. Good" 출력

     ~15회에 정답이 나오면 "정답입니다. Moderate" 출력

     ~20회에 정답을 나오면 "정답입니다. Poor" 출력

20회가 지나도록 정답이 맞추지 못할 경우

"다음 기회에... Very Poor"출력하고 게임을 끝내자.

 

<출력>

=======================================

1~100 사이에 있는 수를 맞추는 게임입니다.

=======================================

1번째 시도입니다. 숫자를 입력하세요!

30

입력한 수가 큽니다.

---------------------------------------

2번째 시도입니다. 숫자를 입력하세요!

20

입력한 수가 작습니다.

---------------------------------------

3번째 시도입니다. 숫자를 입력하세요!

27

정답입니다. Exellent

----------------------------------------

Press any key to continue