Season 01 · EP08 난수와 게임 만들기 - random, drunk, urn 썸네일
← 튜토리얼Season 01 · EP08 · Max/MSP 입문

난수와 게임 만들기 - random, drunk, urn

random으로 균일 분포 난수, drunk으로 자연스러운 변화, urn으로 중복 없는 난수를 만들고 주사위 게임을 제작합니다.

난이도: 초급 예상 시간:

이 에피소드에서 배우는 것

  • random으로 균일 분포 난수 생성하기
  • drunk으로 자연스러운 변화 만들기 (Perlin Noise)
  • urn으로 중복 없는 난수 만들기
  • 난수를 활용한 주사위 게임 제작

사전 지식

  • EP06: 시간 다루기
  • EP07: 조건문과 분기

왜 난수가 필요한가

전자음악에서 난수는 매우 중요한 도구이다. 완벽하게 반복되는 패턴은 기계적으로 들리지만, 여기에 약간의 무작위성을 더하면 훨씬 자연스럽고 생동감 있는 결과를 만들 수 있다. 드럼 머신의 벨로시티에 미세한 랜덤을 더하거나, 아르페지오의 음을 무작위로 선택하거나, 알고리즘 작곡에서 음의 흐름을 결정하는 등 활용 범위가 매우 넓다.

random - 균일 분포 난수

[random 10]은 bang을 받을 때마다 0에서 9 사이의 정수를 무작위로 출력한다. 주의할 점은, 인자로 지정한 숫자는 “범위의 크기”이지 “최대값”이 아니라는 것이다. 컴퓨터의 숫자 체계가 0에서 시작하기 때문에, random 10의 출력 범위는 0~9가 된다.

1~10 사이의 난수가 필요하면 random 10의 출력에 [+ 1]을 연결하면 된다.

random이 만드는 난수는 균일 분포(Uniform Distribution)를 따른다. 모든 값이 동일한 확률로 출현하며, 이전에 어떤 값이 나왔는지와 무관하게 다음 값이 결정된다. 따라서 같은 값이 연속으로 나올 수도 있다.

drunk - 취한 걸음 (Random Walk)

[drunk]는 random과 달리, 이전에 출력한 값의 근처에서 다음 값을 선택하는 난수 생성기이다. 마치 술에 취한 사람이 비틀거리며 걸어가는 것처럼, 값이 급격하게 변하지 않고 완만하게 변화한다. 이를 “Random Walk” 또는 “Drunk Walk”라고 부른다.

[drunk 128 10]이라고 하면, 0~127 범위에서 이전 값으로부터 최대 10만큼 떨어진 곳에서 다음 값을 선택한다. 이 특성 때문에 drunk의 출력은 시간에 따라 부드럽게 흘러가는 곡선을 그리며, 음악에서 자연스러운 변화를 만들 때 매우 유용하다.

urn - 중복 없는 추첨

[urn 10]은 0에서 9 사이의 모든 숫자를 중복 없이 출력하는 오브젝트이다. 마치 제비뽑기처럼, 한 번 나온 숫자는 다시 나오지 않는다. 모든 숫자가 한 번씩 나오면 더 이상 출력이 되지 않으며, clear 메시지를 보내면 다시 처음부터 시작한다.

로또 번호 생성기나, 카드 셔플, 플레이리스트를 중복 없이 재생하는 등의 용도에 적합하다.

실전: Dice Game 만들기

지금까지 배운 것들을 조합하면 간단한 주사위 게임을 만들 수 있다.

게임 규칙: 6면체 주사위 두 개를 6번 굴려서 합산 점수가 높은 쪽이 이기는 게임

필요한 것:

  • [random 6][+ 1]을 연결하여 1~6 사이의 주사위 만들기 (두 세트)
  • [counter 0 5]로 6번 반복 카운팅
  • [+]로 각 라운드의 합산
  • 6번 완료 후 최종 점수 비교

핵심 포인트: 수행 결과가 Max Console에 순서대로 출력되어야 하며, 6번의 주사위 굴림 이후 결과값이 단 한 번만 나와야 한다. 이를 위해 counter의 carry bang과 조건문을 적절히 조합해야 한다. 여기서 EP05에서 배운 실행 순서와 EP06에서 배운 metro, counter가 모두 활용된다.

세 오브젝트의 출력 분포를 시각화하면 차이가 뚜렷하다:

Random / urn / drunk 세 가지 난수의 분포 비교 — Random은 규칙 없이 무작위, urn은 모든 숫자가 단 한 번씩만, drunk는 이전 값 근처에서 부드럽게 변화

핵심 오브젝트 정리

오브젝트분포특징
[random n]균일 분포0~(n-1) 범위, 완전 무작위
[drunk n step]Random Walk이전 값 근처에서 선택, 부드러운 변화
[urn n]비복원 추출0~(n-1) 중복 없이, clear로 리셋

직접 해보기

  1. [metro 100][random 128][number]를 연결하여 무작위로 뛰는 값을 관찰하자
  2. 같은 구조에서 random을 drunk로 바꿔서 값의 변화가 어떻게 달라지는지 비교하자
  3. Dice Game을 직접 만들어보자. 6번 굴림 후 승자를 print하는 것까지 완성하자

다음 에피소드 예고

Season 1을 마무리하고, 다음 Season 2에서는 MIDI 프로그래밍의 세계로 들어간다. 전자 악기들이 서로 어떻게 대화하는지, MIDI라는 표준이 어떻게 탄생했는지부터 알아본다.

자주 묻는 질문

  • [random 10]은 0~10인가요, 1~10인가요?

    0~9입니다. random의 인자는 "범위의 크기"이며 "최댓값"이 아닙니다. 컴퓨터의 인덱스가 0부터 시작하기 때문입니다. 1~10이 필요하면 [random 10]의 출력에 [+ 1]을 연결합니다. 일반화하면 a~b 범위의 난수는 [random (b-a+1)] → [+ a] 패턴으로 만들 수 있습니다. 예: 1~6 주사위 = [random 6] → [+ 1].

  • drunk와 random은 어떻게 다르고 언제 drunk를 써야 하나요?

    random은 매번 완전히 무관한 값을 뽑기 때문에 출력이 점프하듯 튀고, 같은 값이 연속으로 나올 수도 있습니다. drunk는 이전에 출력한 값을 기준으로 ±step 범위 안에서만 다음 값을 고르는 "Random Walk" 알고리즘이라 출력이 부드러운 곡선처럼 흘러갑니다. [drunk 128 10]은 0~127 범위에서 이전 값에서 최대 10만큼 떨어진 곳에서 다음 값을 고른다는 뜻입니다. 음악에서는 휴머나이즈된 벨로시티, LFO 변조, 자연스러운 멜로디 변화 등 "점프하지 않고 흘러가야 하는" 모든 곳에 drunk가 적합합니다.

  • urn으로 로또 번호를 뽑으려면 어떻게 하나요?

    [urn 45]는 0~44 범위에서 중복 없이 한 번에 하나씩 뽑는 비복원 추출 오브젝트입니다. bang을 6번 보내면 6개의 서로 다른 숫자가 나오고, 1부터 시작하려면 [+ 1]을 연결합니다. 모든 숫자가 한 번씩 뽑히면 더 이상 출력이 없으니 [clear] 메시지로 항아리를 다시 채워야 합니다. [uzi 6]으로 bang 6번을 한꺼번에 발사하고 → urn → [zl group 6] → [zl sort]를 연결하면 정렬된 6개 번호가 한 줄로 출력되는 로또 생성기가 됩니다.

  • drunk의 출력이 경계값에 닿으면 어떻게 되나요?

    drunk는 지정된 범위(예: 0~127) 안에서만 움직이며 경계에 닿으면 자동으로 반사되어 안쪽 방향으로 다음 값을 고릅니다. 따라서 출력이 범위를 벗어나는 일은 없습니다. step 인자가 너무 크면 거의 random처럼 보이고, step이 너무 작으면 변화가 잘 안 느껴지므로 보통 전체 범위의 5~10% 정도가 음악적으로 자연스러운 step 값입니다.

실습 패치 다운로드

Max 8 이상에서 열어주세요. 파일을 Max로 드래그하거나 더블클릭하면 실행됩니다.

공식 문서 참조

YouTube

채널에서 더 많은 Max/MSP 예제를 이어서 보세요

튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.

카톡 문의