崩れて、また崩れて — 砂山モデル
各マスに砂粒の数を持たせて、中央のマスへひたすら1粒ずつ落とす。あるマスが4粒以上になったら、4粒を上下左右の隣へ1粒ずつ配って自分は4減らす。これで崩れる。
崩しの一手は、4以上のマスから4を引いて、四方へ1ずつ足す。端では配り先が盤面の外になるので、その向きには配らない。配られた粒は盤面の外でこぼれて消える。sand を直接いじる。崩した結果がそのまま次のマスの判定に効いてよく、読む面と書く面を分けずに、その場で順に崩していける。
// 1マスを崩す: 4 減らして四方へ1ずつ sand[i] -= 4 if (x > 0) sand[i - 1]++ if (x < N - 1) sand[i + 1]++ if (y > 0) sand[i - N]++ if (y < N - 1) sand[i + N]++
崩した先がまた4を超えることがある。盤面を一度なめて、どこか1マスでも崩れたら、もう一周なめ直す。崩れがどこにも起きなくなるまでこれをくり返す。1粒の追加が、その場で雪崩のように連鎖して広がる。
let toppled = true
while (toppled) {
toppled = false
for (let y = 0; y < N; y++) {
for (let x = 0; x < N; x++) {
if (sand[y * N + x] >= 4) {
// ここで上の「1マスを崩す」を実行
toppled = true
}
}
}
}落とし続けると、山はなだらかに高くなるのでなく、四角い領域がフラクタルな紋様に分かれていく。0〜3 の高さを4段の濃淡で塗っているだけで、同じ模様が大小の縮尺でくり返す自己相似の紋様が出る。中央へ1粒足すたびに、崩れの連鎖が広がる範囲はそのつど違う。
砂山モデルは Bak・Tang・Wiesenfeld が 1987 年に提案した、自己組織化臨界(self-organized criticality, SOC)の代表例。臨界(雪崩がどんなスケールでも起き、その大きさがべき乗則に従う状態)は普通、パラメータをぴったり合わせないと現れない。砂山は「4で崩す」だけで、つまみの調整なしに勝手に臨界へ吸い寄せられる。雪崩の大きさのべき乗則は、ノイズの世界でいう 1/f ゆらぎと地続きで、地震の規模分布や山火事など、自然のあちこちで同じ統計が現れる。