Fri Mar 26 2021

randcli

コマンドラインやシェルスクリプトの中から疑似乱数を手に入れる手段はいくつかある. 素直な方法は $RANDOM 変数を使うこと. bash や zsh なら使える.

$ echo $RANDOM $RANDOM
10588 31301

このように $RANDOM という名前の変数にアクセスするたびに疑似乱数を生成してくれる. \(0\) 以上 \(32767\) 以下の整数を一様ランダムにサンプリングしてきてくれる. 少し加工すれば \(0\) 以上 \(1\) 以下の小数にするくらいのこともできる. ちなみに暗号的安全性はない.

Unix 系 OS には疑似デバイスとして /dev/random がある. これを読もうとすると完全にランダムなバイナリを返してくれるから, これを適当に加工して欲しい乱数にする. ハードウェアからのノイズ情報を利用しているので真の乱数と見做せる代わりに遅い. 同様に /dev/urandom もあって, こちらは高速だが疑似乱数である.

といった方法があるが, これらはすぐには使いづらい. $RANDOM は決められた整数範囲から一様サンプルするだけだし, /dev/random はバイナリだから丁寧に整数かなにかに加工しないといけない.

正直, これらを使うくらいならもう ruby やらのスクリプト言語を使うほうがずっと早いしわかりやすい.

$ ruby -e 'p Random.rand'
0.5693897524009822

$ ruby -e 'p Random.rand(10)'
9

一様乱数ならまだいい. 他の分布からのサンプリングがしたくなったら, 毎回その分布のことを調べる必要がでる. 基本的に, 分布関数の累積関数そのその逆関数が分かっていれば, \([0, 1)\) の一様分布からランダムサンプリングして得た値 \(u\) をそれに代入すれば, ほしかった分布関数からサンプリングしてきたことと同値になる. というわけで一様分布があればそこからどうとでも出来るのは出来る. けど毎回調べるのは面倒くさいのでランダムライブラリみたいなのに全部組み込まれてる言語があると良さそうだ.

というわけで作った

randcli というのを作った.

$ cargo install randcli

とすれば rand という名前のコマンドが置かれる. rand コマンドは引数としてスクリプトコードをそのまま渡す. コードといっても基本的にはサンプリング元になる分布の名前を一つ渡すだけでいい.

$ rand gauss
-0.6024180519487203
$ rand gauss
-1.2185961002037267
$ rand gauss
-0.41039698323837

これは正規分布 \(\mathcal N(0,1)\) からのサンプリングである. rand における分布は全て関数であって, パラメータを渡す事ができる. 正規分布は平均と分散という2つのパラメータを持っていて, 上の例では省略しているが, 次のように渡して指定出来る.

$ rand 'gauss(12, 0.3)'
12.087464467710648

大体これだけで良さそうだが簡単な前処理と後処理を付け足すことが出来る. 前処理というのはシード値の指定である.

$ rand 'seed(42) | gauss'

これはシード値を42に固定した上で \(\mathcal N(0,1)\) からサンプリングしてくるというコードである. 同じシード値からは同じ値がサンプリングされる.

後処理としてサンプリングして得た数は実数(浮動小数点)なのでこれを整数(int)に変換するというものである. 四捨五入をする round と床関数 floor がある. int という floor のためのエイリアスもある.

$ 'gauss(0, 100) | int'

人間のこと

楽しさの根源は人間なので人間由来で楽しさを得るのは比較的易しい. しかし虚しい. インターネットをやめるとは人間をやめることである. だから一度依存すると抜けられない. ここに宗教のチャンスがある.

  1. 強い人間になって人間への依存をやめることを目指す宗教
  2. 代わりとなるコミュニティを提供する宗教

1 への過程として 2 があってもいいから, これらは両立する. 死後の救いを説きながら大量殺人をしないのと同様に, 今すぐに人間を脱却する必要はなくて, その時が来るまで 2 でじっと耐えるのもよい.

こちらが用意したDNSしか使えないOSの入ったPC/スマホを買ってもらってこれしか使わせない. TwitterのようなSNSにアクセス出来ない代わりにこちらが用意したSNSにはアクセスできる. SNSの利用に対して料金を請求する.

NextDNS

というDNSがあり, 個人ごとにカスタマイズが出来る. 何もしないでもこれ通して広告やトラッキングが減るなどの利点も大きいが, ペアレンタル機能では平日のこの時間はTwitterを使えなくさせるなどが出来る.

人間とのコミュニケーションは「娯楽」