피씨컴의 기울어진 공관

11일차

프로그래밍/공부 2013. 1. 25. 13:06

● 좀 적은 for로 마름모 별 찍는법?

for(;i>20;i+=a)

{

if(i==3)

{

a=-1;

}

}

 

● 기초 포인터

해당자료형 변수의 주소값을 저장하는 변수

운영체제에 따라 용량이 변한다(32bit 기준 4바이트)

 

● int *a

운영체제로 부터 메모리 공간 어딘가에 자료형에 상관없이 4바이트만큼의 공간을 할당 받고 그위에 a라는 방을 만들고 그 속에는 쓰레기 주소값이 들어있다.

 

※ Why 4바이트 : 인식할수 있는 한계가 4바이트??(다시조사하자)

*주소의 용량이 4바이트 ???

 

 

● & 연산자

해당 변수의 주소를 의미한다 / 너 어디살아 ?

● * 연산자     

포인터 변수가 가리키고 있는 주소에 어떤 값이 있는가? / 거기에 누가살아?

 

● 쫌 신기한거

*(&a) == a

     

'프로그래밍 > 공부' 카테고리의 다른 글

13일차  (0) 2013.01.29
12일차  (0) 2013.01.28
10일차  (0) 2013.01.24
9일차  (0) 2013.01.24
8일차  (0) 2013.01.24
Posted by 피씨컴

10일차

프로그래밍/공부 2013. 1. 24. 13:06

● 저번에 강의 했던 확률 계산

c= rand()% A+B;

if(C>=A) {}

 

보다는

 

if(rand()%100<1)

이 더 쉬움

 

● 순서도 순서

설계 -> 목적 -> 처리대상 -> 순서도(로직설계) -> 로직검증 -> 실제 제작

 

 

● while

특정조건이 거짓일 경우에만 탈출하는 반복문을 작성할때 용이한 반복문

while(조건)

{

명령문

}

 

조건을 검사하여 0이면 while문 안의 명령을 무시한다

(처음부터 0이면 실행되지 않는다)

 

 

● do while

조건을 검사하여 0이면 while 문을 탈출한다

조건이 명령 밑에 있기 때문에 조건이 처음부터 0이라고 해도

반복코드를 1번 실행하게 된다.

 

do

{

명령

}while(조건);

 

 

for == while        같고 서로 바꿀수 있다.

for x do while     같지 않고 바꾸기 힘듬

 

 

● 다중 반복문

반복문안에 반복문이 있는 경우 (반복순서에 유의해서 작성해야한다.

 

● 반복문에서 중요한것

1. 탈줄을 위한 조건

2. 제어문(break / continue)

 

 

 

 

'프로그래밍 > 공부' 카테고리의 다른 글

12일차  (0) 2013.01.28
11일차  (0) 2013.01.25
9일차  (0) 2013.01.24
8일차  (0) 2013.01.24
7일차  (0) 2013.01.24
Posted by 피씨컴

난수 출력함수 rand() / srand()

 

프로그램상 난수를 출력하는것 같지만 일정한 난수열을 가진 표를 가지고 이표에서 값을 하나씩 출력한다.

이 표를 seed값이라하고, 이 표를는 매번 같은 값을 갖게 된다. 그렇기에 rand함수는 주기성을 같게 되고 주기적으로 반복된다.

하지만 이 seed 값을 달리하면 새로운 난수표가 생성된다.

seed 값을 결정하는 함수는 srand()로써 stdlib.h 헤더파일에 존재한다.

 

 

하지만 값을 다르게 할순없다. 값을 다르게 하기위해선 시간의 개념을 추가해야한다.

 time.h 헤더파일을 추가시키고 srand(time(NULL)) 를 사용한다.
이렇게하면 매번 다른 시간대의 값으로 seed값을 정하니 절대로 같은 난수표를 결정할수 없게된다.


이제 이 난수표에서 난수값을 뽑아내는 함수 rand()를 활용하면 완벽한 난수구현 함수가 된다.

하지만 rand()가 리턴하는 난수의 범위는 0~0x7fff  즉, 0~32767의 값을 리턴한다. (0 ~ RAND_MAX)


원하는 범위내의 값을 리턴받고싶다면 rand()%N 과같이 사용한다 N은 리턴범위로써 0~N-1까지 리턴받는다
만일 0~10까지 리턴받고싶다면 rand()%11 로 하면된다. 이를 응용하면 더욱더 효율적으로 값을 리턴받을수있다. 가령 5~10까지 리턴받고싶을땐 어떻게하는가? 수학을 배워봤는가? 그렇다면 계산순서가 어떻게 되는지는 알고있을것이다. 마찬가지로 rand()%11+5 이렇게하면 5~10까지의 값을 리턴받게 된다. 물론 -값도 가능하다

 

여기서 앞서 rand 함수에는 주기성이 있고 주기적으로 반복 된다고 하였는데 일반적으로 알려진  c++  rand함수의 주기는

2^32(== 4294967296) 라고 한다 그러나 어떤 사람이 실제 실험해 보니 2^31 (== 2147483648) 라 하기도 한다.

 

그러나 rand 함수가 실제 난수표를 이용하여 난수를 발생시키는 것은 아니다

2147483648개의 원소를 저장하려면 자료형을 short로 해도 한 seed당 8GB정도이며 그렇게 봤을때

seed가 10개가 된다면 80GB의 용량을 차지해야 하는데... 이러면 당연 활용에 문제가 될것이다.

 

결국 rand 함수는 아래 rand.c의 소스파일을 보면 static long holdrand = 1L; 전역 변수를 기준으로

rand 함수 안에서 단순한 곱셈식과 덧셈, 쉬프트 연산 등을 통하여 난수를 발생시킨다.

이때 이 난수 발생식의 주기가 2147483648를 가지게 되어 난수 자체의 주기가 생긴것이지 난수표를 이용하여

난수를 발생시킨 것이라고 보기는 힘들다
 

 

다음은 rand.c 의 내용

 

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

 

int __cdecl rand (void)
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}

 

void __cdecl srand (unsigned int seed)
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}

'프로그래밍 > 참고' 카테고리의 다른 글

함수  (0) 2013.02.03
지역 변수 / 전역 변수  (0) 2013.01.31
메모리 영역  (0) 2013.01.31
셔플 알고리즘  (0) 2013.01.28
cin  (0) 2013.01.24
Posted by 피씨컴