컴퓨터가 난수를 생성하는 방법은 함수에 입력을 넣어서 출력을 만드는 과정인데, 그 입력값이 시드가 된다. 한 번 시드가 입력되면 그 다음 난수는 방금 생성된 수가 시드가 되기 때문에 첫 값만 입력해주면 된다. 이 때 씨를 뿌리는 것과 비슷하다고 해서 시드라고 부르며, 같은 시드값에 대해서는 동일한 순서의 난수가 생성됨이 보장된다.
일반적으로 시드를 필요로 하지 않는 난수 생성기는 현재 시간을 시드값으로 넣는다.
# case 1 import numpy as np
np.random.seed(10)print(np.random.random_sample(10))// array([0.77132064,0.02075195,0.63364823,0.74880388,0.49850701,0.22479665,0.19806286,0.76053071,0.16911084,0.08833981])# case 2 import numpy as np
np.random.seed(10)print(np.random.random_sample(10))// array([0.77132064,0.02075195,0.63364823,0.74880388,0.49850701,0.22479665,0.19806286,0.76053071,0.16911084,0.08833981])
[Linux, Unix] export, echo 명령어 알아보기 export 그리고 echo 명령어 유닉스 환경에서 개발을 하다보면 export와 echo라는 명령어를 종종 사용하게 됩니다. 간단하게 정리하려고 합니다. 유닉스를 사용한다면 Bash, ZSH라는 이름을 많이 들어보셨을 텐데요. Bash와 Zsh는 쉘 스크립트 언어를 말합니다. 터미널을 키면 그 터미널이 동작하는 방식을 결정하는 것이 쉘 스크립트 언어입니다. 변수와 echo 우리가 알아볼 것은 운영체제 변수와 쉘 변수 입니다. 운영체제 변수는 우리 프로그램이 돌아가는 운영체제의 변수를 말하는 것이 쉘 변수는 터미널 내에서 변수를 말하는 것입니다. water = "삼다수" 명령어를 터미널에서 입력한다면 water라는 쉘 변수를 만드는 것이 됩니다. echo 명령어는 변수를 출력하는 프린트 함수인데요. 다음과 같이 입력하면 water에 저장된 값을 터미널에 출력합니다. 만약 $를 빼고 출력한다면 문자열을 출력하는 것으로 받아들여 water를 그대로 출력하게 됩니다. echo $water unset water unset 명령어는 변수를 삭제하는 역할을 하지요. 내 컴퓨터가 어떤 쉘 스크립트 언어를 사용하는지 궁금하면 bash echo $SHELL 명령어를 통해서 어떤 쉘 스크립트 언어를 사용하고 있는지 알 수 있습니다. 지금까지의 변수들은 쉘 변수들을 다루어 보았구요. 이제 운영체제 변수에 대해서 알아보도록 할게요. env 위의 명령어를 입력하게 되면 운영체제 변수들을 출력하게 됩니다. 모든 프로그램은 운영체제위에서 돌아가기 때문에 운영체제 변수를 다른 말로 환경변수라고도 합니다. export export 명령어를 통해서 쉘 변수를 환경변수로 저장할 수 있는데요. export water 터미널에 위 명령어를 입력하고 env 라고 입력하면 환경변수 목록에 water가 추가되었음을 확인할 수 있습니다. 하지만 이
뼈속 깊이 이해하기 :: 1. 허프만 코딩 시작하면서 인터넷에 허프만 코딩을 검색하면 허프만 코딩은 상당히 쉽다고 설명하면서 허프만 트리를 그려놓고 있다. 그렇지만 어떤 이론도 처음 창안해내는 사람의 관점에서 생각하기는 쉽지 않은 일이다. 지식은 창시자를 떠나 많은 사람을 거쳐서 배울 수록 이해가 아닌 암기가 되기 싶다. 그래서 암기하기 쉬운 지식을 쉬운 지식이라고 말하고 있지는 않은가 싶다. 많은 어려운 이론들을 배우지만 아주 사소한 것도 생산하지 못하는 학생이 되는 것을 경계한다. 그런 관점에서 허프만이 되어 허프만 코딩을 뼈속 깊이 이해하는 것은 쉽지 않은 것 같다 사전 지식 컴퓨터가 정보를 전달하기 위해서는 텍스트를 0과 1로 이루어진 숫자 조합을 보내고 받는 쪽에서 이를 해석해 다시 텍스트로 바꾸는 과정이 필요하다. 고정 길이 코드 란 고정된 크기만큼의 비트를 사용해서 정보를 인코딩해서 보내는 인코딩방식이다. 우리가 알고있는 ASCII, UNICODE가 이에 해당한다. ASCII는 8비트를 사용해서 인코딩하고 UNICODE는 더 큰 비트를 사용한다. 접두어 코드(Prefix-code) 란 한 코드가 다른 코드의 앞부분이 되는 인코딩 방식이다. 예를 들어 모스 부호는 알파뱃 S를 "· · ·"로 , 알파뱃 E를 "·"로 인코딩한다. 따라서 알파뱃 E를 표현하는 "·"는 알파뱃 S를 표현하는 "···"의 앞부분과 완전히 일치한다. 이 경우 "···"코드를 전달할 때는 코드를 전달받는 사람이 (· · ·)를 EEE가 아닌 S로 해석하기를 기도해야 한다. 이와 같이 접두어 코드는 일련의 코드 조합이 의도하지 않은 방향으로 해석될 수 있는 해석의 어려움을 갖는다. Prefix-free-code 란 한 코드가 다른 코드의 접두어가 되지 않는 코딩방식이다. 우리가 오늘 다룰 주제인 허프만 코딩이 그 대표적인 방법이다. {
컴퓨터는 단지 숫자다 :: 2. 부동 소수점 반올림과 Rounding 컴퓨터는 단지 숫자다 :: 근사와 Rounding 부동 소수점 표현법 이전 포스팅 보기 서론 프로그래밍 언어는 어떤 언어든지 완전하지 못하다. 이번 파트에서는 프로그램 언어가 가지는 태생적인 결함 중에서 근사에 대한 얘기를 해보려고 한다. 플라톤은 자신의 철학 사상을 얘기하면서 '이데아’를 주장하였다. 사람이 그린 어떤 삼각형도 모든 내각의 합이 결코 정확한 180도가 될 수 없지만 세상 밖에서는 모든 내각의 합이 정확히 180도인 삼각형의 원형이 존재한다는 사상이었다. 컴퓨터마저도 수를 표현함에 있어 '이데아’를 실현하지는 못한다. 예를 들어 0.1이라는 수를 컴퓨터는 정확히 표현할 수 없어 0.10000000000000000555111512... 이라는 값으로 저장한다. 정밀도에 따라 32비트 혹은 그 이상이 될 수 있겠지만 중요한 것은 컴퓨터도 때로는 정확한 값을 저장할 수 없다는 말이다. 이러한 오차는 별 것 아니라고 생각할 수 있겠지만 제대로 컨트롤 하지 못하는 수의 오차는 생각보다 심각한 문제를 일으키기도 한다. 1991년 2월 25일 1차 걸프 전쟁 기간중 사우디아라비아 Dharan에 위치한 미국 패트리엇 미사일 부대는 날아오는 이라크의 스커드 미사일을 격추하는 데 실패해 28명의 대원이 사망 했다. 미국 조사위는 이 실패에 관해 상세한 조사를수행한 결과 수치 계산의 부정확성이 주요 원인이라는 결론을 내렸다. 패트리엇 시스템은 내부적으로 0.1초마다 증가하는 카운터가 있었고 0.1초를 내부적으로 24비트에 저장해 근사값으로 더하고 있었다. 이 때 0.1초의 오차는 2 − 2 0 × 1 1 0 2^{-20}\times{1\over10} 2 − 2 0 × 1 0 1 이었고 약 100시간동안 패트리어트 시스템이 동작하고 있었고 스커드 미사일이 2000m/s로 날아오고 있었다. 그 결과 격추 시스템의 오차는 약 6
댓글
댓글 쓰기