今回は色々な乱数を、Pythonのライブラリ, Numpyを使用して生成し、Voronoiを作成してます。乱数について勉強したものの備忘録として記事化しとくことにしました。よければご参考ください。
概要
今回はNumpyを使用して5種類の乱数を生成していきます。
NumpyをGrasshopperで使用するために、プラグインGH Python Remoteを使用しております。(※インストール・環境構築・使用方法はこちらを参照してください)
以下がGrasshopperコンポーネントの全体像です。

ざっくり説明しますと、
- Anacondaでnumpyをインストールした仮想環境を構築し、GhpythonRemoteでnumpyをGrasshopper側で使用できるようにしております。
- Ghpythonコンポーネントで入力値で指定された乱数を生成して出力しています。乱数は0~1の範囲で(x, y)2次元配列で生成しています。
- 生成した乱数を原点(0.5, 0.5)の1×1の正方形内に配置し、配置した点からVoronoiを作成しています。
- その後、Boudary Surfaceコンポーネントでサーフェイスを生成し、Extrudeコンポーネントでz方向に押し出します。
- 最後に、見やすくするために白黒に色付けしてます。
pythonコード全体
from ghpythonlib import treehelpers as th
import rpyc
import scriptcontext as sc
np = sc.sticky['numpy']
rng = np.random
ptnum = 200
dimension = 2
def min_max(x, axis=None):
min = x.min(axis=axis, keepdims=True)
max = x.max(axis=axis, keepdims=True)
result = (x-min)/(max-min)
return result
if x == 0:
uniform = rng.uniform(0,1,(ptnum, dimension))
random_type = min_max(uniform)
elif x == 1:
normal = rng.normal(0,1.0,(ptnum, dimension))
random_type = min_max(normal)
elif x == 2:
triangular = rng.triangular(0,0.5,1,(ptnum, dimension))
random_type = min_max(triangular)
elif x == 3:
beta = rng.beta(2, 2, (ptnum, dimension))
random_type = min_max(beta)
elif x == 4:
step = rng.choice([-0.1,0.1],ptnum)
random_walk = np.cumsum(step)
list = np.array([])
tmp_list = list.tolist()
step = np.arange(0, 1, 1/ptnum)
remap_walk = min_max(random_walk)
for x, y in zip(step, remap_walk):
tmp_list.append(x)
tmp_list.append(y)
np_convert_list = np.asarray(tmp_list)
reshape_list = np.reshape(np_convert_list, (ptnum, 2))
random_type = reshape_list
val = rpyc.utils.classic.obtain(random_type.tolist())
val = th.list_to_tree(val, source=[0,0])
上のコードがpythonコードの全体となってます。
- 必要なモジュールをインストール
- 入力端子の値によって、5種類の乱数のうち1つ生成
- 乱数を0~1の範囲に正規化
- Grasshopperで使用できる形式に変換して掃き出してます。
一様分布

一様分布の乱数を生成した際のVoronoiです。
numpy.random.uniformを使用してます。
最も一般的な乱数で、点の位置からも満遍なくランダムな値が出力されているのがわかります。
正規分布

正規分布から生成する乱数。numpy.random.normalを使用しています。
わかりやすいように点の数を500点に増やしてます。
0.5を平均値にしているので、点が中心によっているのがわかります。
三角形分布

三角形分布から生成した乱数。numpy.random.triangular を使用してます。
こちらも、0.5を最頻値としているので、やや中心に点がよっているのがわかります。
ベータ分布

ベータ分布から生成した乱数。numpy.random.beta を使用してます。
三角形分布ほどではないですが、中心によっているのがわかります。
ランダムウォーク

ランダムウォークを使用した乱数。株などの値動きで見られるものになります。
x方向は一定に増えていき、y方向にランダムウォークの値を使用してます。
おわり

ランダムな値はしばしば使いますが、いろんな乱数を使用したパターンを備忘録として残しときます。
【参考】
- HeadBoost:https://www.headboost.jp/
- Qiita Pythonでランダムウォーク : https://qiita.com/toyolab/items/6535420f5ef637a4d2e8
- 乱数とコンピュテーショナルデザイン ~その1・乱数の種類~ : https://www.archifuture-web.jp/magazine/649.html
- 乱数とコンピュテーショナルデザイン ~その2・設計における乱数の利用~ : https://www.archifuture-web.jp/magazine/669.html
- 乱数とコンピュテーショナルデザイン ~その3・階層性/連続と離散の統合~ : https://www.archifuture-web.jp/magazine/693.html
以上