Elixir에서는 열거 가능한 자료 구조(예: 배열, 범위)에서 무작위로 원소 하나를 고를 때 Enum.random을 사용해요. 이 함수는 원소 하나를 고르는데, 모든 원소가 뽑힐 확률이 같아요.
Elixir에는 무작위 실수를 뽑는 자체 함수가 없어요. 그러려면 Erlang을 직접 사용해야 해요.
Elixir 코드는 BEAM 가상 머신에서 실행돼요. BEAM은 Erlang 런타임 시스템의 일부예요. Erlang에서 영감을 받았고 실행 환경을 공유하기 때문에, Elixir는 Erlang 라이브러리와 뛰어난 상호 운용성을 제공해요. 덕분에 Elixir 개발자는 자신의 Elixir 코드 안에서 Erlang 라이브러리를 사용할 수 있어요. 실제로 Elixir 커뮤니티에서는 이미 Erlang 라이브러리가 제공하는 기능을 위해 Elixir 라이브러리를 작성하는 것을 권장하지 않아요.
그래서 수학 연산이나 타이머 함수 같은 일부 기능은 Elixir에서 Erlang을 통해서만 사용할 수 있어요.
Erlang의 표준 라이브러리는 별도의 추가 작업 없이 우리 Elixir 코드에서 바로 사용할 수 있어요.
Erlang 함수는 Elixir 함수를 호출하는 것과 같은 방식으로 호출할 수 있는데, 작은 차이가 하나 있어요. Erlang 모듈 이름은 snake_case 아톰이에요. 예를 들어 math 모듈의 Erlang pi/0 함수를 호출하려면 이렇게 써요:
:math.pi()
# => 3.141592653589793
Elixir에 대응하는 함수가 없는, 가장 많이 쓰이는 Erlang 함수는 다음과 같아요:
:timer.sleep/1은 주어진 밀리초만큼 프로세스를 일시 중단해요.:rand.uniform/0은 0.0 <= x < 1.0 범위의 무작위 실수 x를 생성해요.:io_lib.format/2는 C 스타일의 문자열 서식(제어 시퀀스를 사용)을 제공해요. 이 함수를 사용하면 예를 들어 2에서 36 사이의 임의의 진법으로 정수를 출력하거나, 원하는 정밀도로 실수를 서식화할 수 있어요. 이 함수는 많은 Erlang 함수처럼 charlist를 반환한다는 점에 유의해요.sin/1, cos/1, log2/1, log10/1, pow/2 등 수학 함수를 제공하는 math 모듈도 있어요.Erlang의 표준 라이브러리를 살펴보려면 STDLIB 레퍼런스 매뉴얼을 확인해 봐요.
Mary는 TV 시리즈 _Star Trek: The Next Generation_의 열렬한 팬이에요. 그녀는 친구들과 함께 _Starship Enterprise_의 승무원인 척하는 펜 앤 페이퍼 롤플레잉 게임을 자주 해요. Mary의 캐릭터는 Picard 함장이라서 함장 일지를 적어야 해요. 그녀는 게임의 창작적인 부분은 좋아하지만, 즉석에서 무작위 데이터를 만드는 것은 좋아하지 않아요.
함장 일지에 자주 등장하는 데이터를 위한 무작위 생성기를 만들어서 Mary를 도와줘요.
_Starship Enterprise_는 여행 중에 수많은 행성을 만나요. Star Trek 세계관의 행성은 특성에 따라 여러 등급으로 나뉘어요. 예를 들어, 지구는 M등급 행성이에요. 가능한 모든 행성 등급은 D, H, J, K, L, M, N, R, T, Y예요.
random_planet_class/0 함수를 구현해요. 이 함수는 행성 등급 중 하나를 무작위로 반환해야 해요.
CaptainsLog.random_planet_class()
# => "K"
Enterprise(등록 번호 NCC-1701)만 우주를 날아다니는 게 아니에요! 다른 우주선과 만나면, Mary는 그 우주선의 등록 번호를 기록해야 해요.
등록 번호는 "NCC-" 접두사로 시작하고, 그다음에 1000부터 9999까지(포함)의 숫자가 와요.
무작위 우주선 등록 번호를 반환하는 random_ship_registry_number/0 함수를 구현해요.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
날짜도 없는 일지가 무슨 소용이 있을까요?
스타데이트는 실수예요. _The Next Generation_의 첫 번째 시즌에 나오는 _Starship Enterprise_의 모험은 스타데이트 41000.0과 42000.0 사이에서 펼쳐져요. "4"는 24세기를, "1"은 첫 번째 시즌을 나타내요.
41000.0(포함)과 42000.0(미포함) 사이의 실수를 반환하는 random_stardate/0 함수를 구현해요.
구현에는 Erlang 함수를 사용해야 해요.
CaptainsLog.random_stardate()
# => 41458.15721310934
함장 일지에서는 보통 스타데이트를 소수점 한 자리로 반올림해요.
실수를 받아서 소수점 한 자리로 반올림한 수를 문자열로 반환하는 format_stardate/1 함수를 구현해요.
구현에는 Erlang 함수를 사용해야 해요.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.