모래 한 알이 눈사태를 일으킬 수 있을까
모래 한 알은 너무 가벼워서 눈사태 같은 큰일을 일으킬 리 없다고 생각하기 쉽습니다. 큰 사태에는 큰 원인이 있을 테니까요. 그런데 이 모래더미에서는 똑같은 한 알이 어떤 때는 아무 일도 일으키지 않고, 어떤 때는 판 전체를 뒤흔드는 눈사태를 일으킵니다. 어느 쪽일지는 미리 알 수 없는데도, 사태 크기의 통계는 놀랍도록 질서정연합니다.
모델은 이렇게 움직입니다
- 판은 정사각형 격자이고 칸마다 모래알이 0~3개 쌓입니다. 한 번에 한 알을 무작위 칸(또는 가운데 칸)에 떨어뜨립니다.
- 한 칸에 모래알이 4개 이상이 되면 그 칸이 무너져, 위·아래·왼쪽·오른쪽 이웃 칸에 한 알씩 나눠 줍니다(4알이 줄어듭니다). 이웃이 4알이 되면 이어서 무너지는데, 이 연쇄가 눈사태입니다. 판 가장자리 밖으로 나간 알은 사라집니다.
- 눈사태의 크기는 그 알 하나가 일으킨 무너짐의 총 횟수입니다. 아무 칸도 무너지지 않으면 0입니다. 아무것도 조절하지 않았는데도 더미가 알아서 이런 상태에 이르는지 지켜보세요.
직접 돌려보기
① 모래더미 지켜보기
색은 칸의 모래알 수입니다(남색 0, 청록 1, 노랑 2, 분홍 3). 눈사태가 나면 무너진 칸이 하얗게 번쩍입니다. 처음에는 알이 쌓이기만 하다가, 어느 순간부터 크고 작은 눈사태가 계속 일어나요. 회색 영역이 지나면 더미가 안정기에 들어선 것입니다.
② 3D로 보기: 무너지기 직전의 모래 지형 3D
①과 같은 모래더미를 칸마다 쌓인 모래알 수만큼의 기둥으로 세웠습니다. 위에서 재생·일시정지·한 알 떨어뜨리기를 하면 여기서도 똑같이 움직입니다. 빨간 기둥은 이미 3알이 쌓여 한 알만 더 오면 무너지는 칸입니다. 안정기에 들어서면 빨간 기둥이 판 곳곳에 이어져 있어서, 그 위에 떨어진 한 알이 이웃의 빨간 기둥을 줄줄이 무너뜨립니다. 무너진 칸은 하얗게 번쩍이며 낮아집니다.
위 모래더미를 입체로 본 것입니다(새로 계산하지 않음). 드래그로 회전 · 휠이나 두 손가락으로 확대 · 휴대폰에서 세로로 쓸면 페이지가 내려갑니다
③ 눈사태는 얼마나 컸을까
알을 하나 떨어뜨릴 때마다 눈사태 크기를 세로 막대로 그렸습니다(가까운 알끼리는 가장 큰 것만 보입니다). 대부분은 바닥에 붙어 있고, 가끔 하늘로 솟는 뾰족한 막대가 있습니다. 회색 영역은 아직 더미가 쌓이는 중인 구간입니다.
④ 작은 눈사태와 큰 눈사태는 얼마나 자주 날까
안정기 이후의 눈사태를 크기별로 세어 가로세로 모두 로그 눈금으로 그렸습니다(무너진 적 없는 0은 뺐습니다). 점들이 대체로 내려가는 직선을 이루면 작은 사태는 아주 흔하고 큰 사태는 드물지만 아예 없지는 않다는 뜻입니다. 빨간 점선은 표본 10개 이상인 점들에 맞춘 직선이고, 기울기는 이 판 크기에서 실제로 잰 값입니다.
⑤ 쌓을수록 높이는 계속 오를까
모래알이 쌓이면서 평균 높이가 오르다가, 어느 값에서 더는 오르지 않고 오르내리기만 합니다. 더 얹어도 가장자리로 흘러나가는 알과 새로 얹는 알이 균형을 이루기 때문입니다.
이 결과가 말하는 것, 말하지 않는 것
말하는 것:
- 모래 한 알은 대부분 아무 일도 못 일으키지만, 아주 드물게 수천 번의 무너짐이 돼요. 떨어뜨린 알의 57%는 아무 칸도 무너뜨리지 못했고, 가장 큰 눈사태는 중앙값의 약 208배였어요.
- 같은 칸에 같은 한 알을 3,000번 더해도 56%는 아무 일이 없었고 592번은 100번 넘게 무너졌어요. 한 칸이 무너지면 이웃 넷에게 알이 넘어가 연쇄가 이어지기 때문이에요.
- 그렇다면 큰 사건을 볼 땐 마지막 원인이 얼마나 컸나보다, 연쇄가 일어날 만큼 쌓여 있었는지를 먼저 보면 돼요. 같은 작은 원인이 아무 일 없기도, 큰 사건이 되기도 해요.
상세 설명
말하는 것: 판 크기 40×40, 무작위로 떨어뜨리기, 알 20,000개를 다섯 번(시드 1~5) 돌렸을 때, 알이 쌓인 지 약 4,800개(칸 수의 3배) 뒤부터 평균 높이는 2.1 안팎(2.07~2.11)에서 멈췄습니다. 이후 떨어뜨린 알의 57%는 아무 칸도 무너뜨리지 못했고, 무너짐이 있었던 눈사태의 중앙값은 20번인데 가장 큰 것은 3,778~4,760번(중앙값의 180~241배, 평균 약 208배)이었습니다. 눈사태 크기 분포를 로그-로그로 맞춘 기울기는 -1.17~-1.25(평균 -1.22)였습니다. 판 크기에 따라 기울기는 20×20에서 -1.35, 60×60에서 -1.20, 100×100에서 -1.18로 조금씩 달랐습니다. 같은 칸(가운데)에 같은 한 알을 3,000번 더해 보아도 56%는 아무 일이 없었고 592번은 100번 이상 무너졌으며 가장 큰 것은 3,889번이었습니다. 가운데에만 떨어뜨리면(20,000알) 아무 일 없는 비율이 68%, 기울기는 -1.18이었습니다(한 번 돌린 값).
말하지 않는 것:
- '작은 사태는 흔하고 큰 사태는 드물다'와 '같은 한 알이 결과가 천차만별이다'는 이 시뮬레이션이 직접 보여 준 거예요. 지진·산불·주가 폭락과 닮았다는 건 암시일 뿐 생각해 본 쪽이에요.
- 실제 모래더미나 지진, 산불, 주가 폭락의 원인을 설명하는 건 아니에요.
- 현실의 사건 크기를 모아 분포를 비교하고, 이웃에게 전해지는 연결이 실제로 있는지 살펴봐야 해요.
상세 설명
말하지 않는 것: 실제 모래더미나 눈사태를 재현한 것이 아닙니다. 네 이웃에게 나눠 주는 규칙만 가진, 이 프로젝트의 단순화된 모델입니다. 지진, 산불, 주가 폭락 등에서도 작은 사건은 흔하고 큰 사건은 드문 비슷한 통계가 보고되었다는 이야기가 흔히 인용되지만, 이 시뮬레이션이 그 현상들의 원인을 설명하거나 증명한 것은 아닙니다. 닮았다는 것은 암시일 뿐입니다. 기울기는 판 크기와 표본이 한정된 이 실험에서 잰 값이며, 이론의 정확한 지수를 확인한 것이 아닙니다. 실제 모래더미 실험에서는 이 이상적 모델만큼 깔끔한 결과가 나오지 않는 경우가 많다고 알려져 있습니다.
이론적 근거와 구현 메모
- 모델의 뿌리: 1987년 Bak, Tang, Wiesenfeld가 제안한 모래더미 모델로, 아무것도 조절하지 않아도 계가 스스로 임계 상태에 이른다는 자기조직화 임계성(self-organized criticality)의 대표 예입니다. 출처: Bak, Tang & Wiesenfeld (1987), "Self-organized criticality: An explanation of the 1/f noise", Physical Review Letters 59, 381.
- 핵심 가정과 수식: 칸 높이
h가 4 이상이면h → h − 4로 줄고 상하좌우 이웃 네 칸의 높이가 각각 1 늘어납니다. 눈사태 크기s는 이 무너짐의 총 횟수이고, 임계 상태에서는 큰 사태까지P(s) ~ s−τ꼴의 거듭제곱 분포를 따를 것으로 봅니다. 슬라이더는 판의 한 변 길이(격자 크기)입니다. - 이 프로젝트의 단순화: 이 프로젝트는 가장자리로 알이 빠져나가는 정사각형 격자, 임계 높이 4, 한 번에 한 알이라는 가장 단순한 형태만 구현했습니다. 알이 쌓이는 속도와 눈사태가 끝나는 속도를 분리한 것도 모델의 설정이며 실제 모래의 마찰과 관성은 없습니다. 판 크기 기본값 40과 안정기 기준(알 수의 3배)은 이 프로젝트가 정한 값입니다.
- 이론값과 시뮬레이션: 이 모델의 거듭제곱 지수에 대해 이 프로젝트가 직접 확인한 교과서 값은 없습니다. 보고된 값은 눈사태 크기를 무엇으로 재는지와 격자 크기에 따라 달라서 맞춰 보지 않았고, 시뮬레이션에서 잰 값만 적습니다. 40×40에서 기울기는 -1.17~-1.25(평균 -1.22)이고 판이 커질수록 -1.35(20×20), -1.20(60×60), -1.18(100×100)로 완만해졌습니다. 보존 검사(더한 알 = 남은 알 + 사라진 알)와 모든 칸이 3 이하로 안정되는지는
node tools/validate-sandpile.js에서 확인했습니다. - 더 읽을거리: Bak, Tang & Wiesenfeld (1987), Physical Review Letters 59, 381 (위 논문). Per Bak (1996), How Nature Works: The Science of Self-Organized Criticality, Copernicus.
- 눈사태는 쌓인 칸을 스택에 넣어 처리하는데, 무너지는 순서는 최종 모양과 무너짐 횟수에 영향을 주지 않습니다. 분포는 크기를 약 1.5배씩 넓어지는 구간으로 묶어 구간 폭으로 나눈 비율을 그리고, 표본 10개 이상인 구간에 최소제곱으로 직선을 맞춥니다. 난수는 시드를 쓰는 mulberry32입니다.