본문 바로가기

전체 글43

컴퓨터의 랜덤은 진짜 랜덤이 아니다? 의사 난수에 대한 이야기 (1) 약 6 년 만에 복귀한 첫 글의 주제로 선택한 것은 의사 난수( Pseudo Random )에 대한 이야기이다.의사난수에 대한 설명과 그와 관련된 알고리즘을 하나 소개해볼까 한다.  우리는 컴퓨터로 게임이나 작업, 하다 못해 누가 당첨일지 사다리 타기를 하면서까지 수많은 랜덤을 만나게 되는데, 가끔 '동시'에 서로 다른 사람이 랜덤을 뽑았을 때 동일한 결과를 가져본 적이 있을 것이다. ( 워크래프트나 스타크래프트를 해본 사람은 안다 )  마인크래프트 같은 로그라이크류 게임의 시작에서 어떤 특정한 Seed를 입력하니까 동일한 시작을 할 수도 있다. 그렇다면 이런 의문을 가져본 적이 있을 수도 있다.  "어, 이거 진짜 랜덤 맞아? 왜 똑같은 결과가 나오지?" 그렇다. 컴퓨터 속에 존재.. 2024. 4. 24.
동적 표를 이용하자. 동적표란 우리가 계산하면서 나온 결과값을들 저장해두는 표를 말한다. 이러한 행위를 왜 하는가? 관계기반 설계를 설명할 때, 탐색기반을 함께 설명했었다. 그때 탐색기반의 단점을 해소 하기 위해 '배제'를 한다고 했었는데 동적 표를 이용하여 비슷한 개념의 행위로 똑같은 효과를 낼 수 있다. 무슨 뜻이냐면, 이미 계산한 결과를 저장해두고, 중복되는 일이 있을때 그값을 꺼내 오기만 하면 된다. 이로써 중복된 연산을 피할 수 있고, 결론적으로 더 빠르고 효율적인 프로그램이 되는 것이다. 또한, 이전 값을 이용해서 다음 값들을 채워 나갈 수 있다. 이전 값이 반드시 필요한데 이건 관계 기반 설계에서 f(1)을 미리 구한 것과 같다. ex) 피보나치 수열 1) 동적 표를 사용하지 않은 방식 1234567int f(i.. 2016. 12. 18.
관계기반 알고리즘의 설계 알고리즘 설계법은 크게 두 가지가 있다. 1. 관계기반 설계 각 값들 사이의 관계를 이용하여 해를 구하는 방법 함수로 표현할 수 있어야 하며, 점화식같은 형태를 이용하여 표현 할 수 있어야 한다. 2. 탐색기반 설계 컴퓨터의 빠른 연산으로, 모든 집탑을 탐색하는 방법. 크기에 비래하여 시간이 길어질 수도 있다. 때문에 배제를 한다. ex) 1 ~ n 까지의 합 1) f(1) = 1;f(n) = f(n-1)+n; (n>=2) [출처] 알고리즘 심화 - 관계기반 알고리즘의 설계|작성자 bestmaker 1234567int f(int n){ if (n == 1) return 1; else return f(n - 1) + n;}cs 위와 같이 표현할 수 있겠다. 2) f(k) 를 n/2 로 가정 f(1) = 1.. 2016. 12. 18.
복사 생성자 12345678910111213141516171819202122232425262728293031#include #include #include class position{private: char *name; int age;public: position(char *aname, int age) { position::name = aname; position::age = age; } ~position() { puts("파괴"); }}; int main(void){ position a("갓코더", 17); position b = a;} Colored by Color Scriptercs 설명은 거두절미하고, 위의 코드가 정상적으로 돌아갈 것 같은가? 분명 컴파일은 성공적일 것이다. 하지만, 종료되고 파괴자가 실행되.. 2016. 7. 27.