前回は一種のフィルタともいえるsmoothノードでした。つい「調子」にのって別投稿にてsmoothノードのフィルタの特性を伝達関数から考察したりもしてしました。今回は乱数生成、randomノードです。乱数生成は伝達関数以上に奥深くて、そこに命を懸けている人も居るとか居ないとか。知らんけど。ここは深みにハマらぬよう「さらっと」行きたいです。
※「ブロックを積みながら」投稿順 index はこちら
今回のテスト用のNode-Redのフローはちょっと長めです。実は前回のフローのほぼ使い回し(コピペ)です。各ノードの御名前こそ random ノードのテスト用に変更していますが、新たな要素は真ん中に鎮座する random ノードだけなんであります。
左から順番に列挙すれば
-
- injectノード、ボタンを押す度に10要素の配列を送出する(前回と同じ)
- splitノード、配列を1要素毎に分割する(前回と同じ)
- randomノード、要素が入力すると1個乱数を送出する(新)
- smoothノード4つ。それぞれ100要素の平均、最大、最小、標準偏差を求める(前回と同じ)
- debugノード4つ。平均、最大、最小、標準偏差をデバッグウインドウに出力
randomノードは入って来たmsgの内容にかかわらず「サイコロ」を振るみたいなので、injectとsplitは生成する要素の個数を決めているだけです。
フローの外観が以下に。
なお、ちょっと気になる random ノードの乱数生成ですが、Node-Redのソースを覗き見したところ、浮動小数点の場合は、普通にJavaScriptの以下の関数を呼んでいるだけのようです。
Math.random()
上記の関数は JavaScript処理系の実装依存のようなので、Node.jsを調べれば乱数アルゴリズムは分かるのでしょうが、見ていません。まあ、生成された乱数のの偏りなどが気になる用途の人は、きっと自分で乱数生成するであろうと想像します。多分、Math.random()で私は十分であろうと。乱数に命かけてないし。。。
randomノードの設定
今回 randomノードの設定は以下のように実数としました。Helpにも書いてありますが、ここの設定にはちょっとクセがあり、整数型で上限、下限を設定すると上限、下限を含むとなり、実数型だと、下限を含み、上限を含まずとなるようです。
結果集計用の smoothノードの設定
前回使ってみた smoothノードで、生成した乱数100個あたりの平均、最大、最小、標準偏差(標本)の集計をやってもらいました。設定はこんな感じ。
実行結果
Injectノードのボタンを10回押して生成した乱数100個の平均、最大、最小、標準偏差は以下のようでした。
偏りなどの考察に入ると沼にハマりそうなので、今回はここまでといたしとうございまする。