これは何?
前回の記事「短いコードで複雑な結果を得る~一次元セル・オートマトン~」の修正版です。
以下を修正しました。
- オートマトンをジェネレータで実装
- 結果を画像として保存
1セル1ピクセルで描画するとちょっと何言ってるか分からないですね。
コード
import numpy as np
from PIL import Image
import random
# セル状態を返すジェネレータ
def CA( rule_id, n_cell, init_cell_id = -1):
rule = list(map(int, f'{rule_id:08b}'))
# 初期状態
if init_cell_id < 0:
cell_c = [random.randint(0,1) for _ in range(n_cell)]
else:
# 初期値としてint値を与えると、そのビットパターンを初期状態とする
cell_c = list(map(int, f'{init_cell_id:b}'.zfill(n_cell)[-n_cell:]))
cell_c = np.array(cell_c)
yield cell_c
while True:
cell_n = [ rule[cell_c[i-1]*4 + cell_c[i]*2 + cell_c[(i+i) % n_cell]] for i in range(n_cell)] # 次の状態
cell_c = cell_n # 状態の入替
yield cell_c
random.seed(110)
# データ作成
W, H = 640, 480 # 幅, 高
img = np.zeros((H, W))
ca = CA( 30, W) # ルールID, セル数
for h, c in zip(range(H), ca):
img[h,:] = c
# 画像として保存
img = Image.fromarray(img*255).convert('RGB')
img.save('ret.png')