読者です 読者をやめる 読者になる 読者になる

kkana's blog

新米コーダーの忘れそうなことメモ

nature of code:今日の練習「セルオートマトン」

See the Pen cellular automaton by kanaparty (@kanaparty) on CodePen.

セルオートマトン

セルオブジェクトで構成された系のモデル
グリッド状になっていて、状態、近傍がある。そして時間の経過(=世代)がある。

一番簡単なセルオートマトン

世代を一列のグリッドとする。世代を重ねるごとにその下の一列に結果(onだったら色のついた四角)を描いていく。
状態はonかoffの2種類。
近傍は自分の左右のセル。

今の状態から次の世代の状態を決めるルールをつくる

次の世代がonかoffかどうかは前と前の前後の状態の3つのセルの状態で決まる。
3つの状態から結果を決める・・・おこりうるonとoffの組み合わせが8パターンある。
8パターンのうちどれをonとするか定義する。
かいたものでいうとこの部分

//ルールの初期化
function resetRule(){
  cellRule = [];
  for (var i = 0; i < 8; i++) {
    var state = (Math.random() > 0.5) ? 1 : 0;
    cellRule.push(state);
  }
}

そのルールの呼び方は、ルールの並びを10進数に直した整数で付けられている。

//セルルールの名前
function ruleName(){
  var rule2 = '';
  for (var i = 0; i < cellRule.length; i++) {
    rule2 += String(cellRule[i]);
  }
  ruleNameDOM.textContent = 'Rule : ' + parseInt(rule2, 2);
}

きれいにみえるのは 30とか90とか

ルールを配列に格納しておいて、並び順を10進数にすると簡単に配列にアクセスできる(なるほど!)

var terms = String(this.prev.prevState) + String(this.prevState) + String(this.next.state);
terms = parseInt(terms, 2);
this.state = cellRule[terms];

できあがるパターンには4つの分類がある(ウルフラムの分類)

  • 均一性 最終的にすべてのセルが一定になる
  • 周期性 反復的に繰り返す
  • ランダム性 簡単に識別できるパターンができない
  • 複雑性 周期性とランダム性がまざったようなもの

セルオートマトンの歴史 おもしろ〜!


たまにハッとするようなきれいな模様がでてくる。

1次元のセルオートマトンを下へ下へ繋げていくので少し混乱した。 このルールでいろいろ表現の仕方を変えたら楽しそうなのでまたやってみたい