Simulizer

Doing things many times

시뮬레이션의 대부분은 같은 계산을 조건만 바꿔 가며 여러 번 반복하는 일입니다. 시간을 한 단계씩 진전시키기, 격자 점을 하나씩 갱신하기, 무작위 실험을 한 번씩 시행하기 — 모두 같은 모양을 하고 있습니다.

Two kinds of repetition

여러 번 반복 블록은 반복 횟수를 미리 안다는 가정 위에서 작동합니다. "이걸 n 번 해 주세요"라고 지시하는 셈입니다. 반복문 안에는 지금이 몇 번째인지를 알려 주는 변수(보통 i)가 있습니다.

조건이 참인 동안 반복 블록은 몇 번 돌지 모를 때 씁니다. 어떤 조건이 깨질 때까지 계속 도는 방식입니다. 무한 반복에 빠질 위험이 있으므로, 그 조건이 반드시 변하는지 확인하세요.

What index i is for

i 는 단순히 몇 번째인지를 세는 카운터이지만, 반복문 안에서는 실제 위치·시간·표본 번호로 자주 쓰입니다.

  • 배열에 값을 채울 때: arr[i] = …
  • 시간 한 단계: t = i * dt
  • 가로축 위치 한 점: x = x_min + i * dx

같은 변수 i 가 이렇게 여러 가지 의미로 쓰일 수 있다는 점이 처음엔 어색하게 느껴질 수 있습니다.

Nested repetition

반복 안에 반복을 넣으면 횟수가 곱셈으로 불어납니다. 바깥 반복이 nt 회, 안쪽 반복이 nx 회면 안쪽 본문은 nt × nx 번 실행됩니다. 2차원 격자 시뮬의 매 시간 단계가 바로 이런 모양입니다.

빠르게 끝나는 반복이라면 큰 문제가 없지만, 본문이 무거우면 이 곱셈이 금세 부담이 됩니다. 100 × 100 × 1000 = 1000만 번 처럼 커지는 식입니다.

Pitfalls

  • 반복 안에서만 만든 변수는 반복 밖에서 쓸 수 없습니다. 결과를 남겨 두려면 반복 밖에 만든 배열에 값을 담아 두세요.
  • 조건 반복(while)의 조건이 영원히 참이면 실행이 멈추지 않습니다. Simulizer는 무한 반복을 자동으로 끊어 주지 않습니다.
  • 매 반복마다 결과 패널로 보내는 호출은 비용이 크므로, 그래프 같은 결과는 반복이 끝난 뒤 한 번에 모아서 보내세요.

See also