Gauche:Translation:Devlog:そしてランダムデータ生成器がやってきた
(原文: And here comes random data generators)
さあランダムデータ生成器の登場です
ランダムデータ生成器やそのコンビネータのコレクションである、data.randomをチェックインしました。 API 関数の名前はまだ本決まりではありませんが、私は全体的にそれが良い形だと思います。 (0.9.4が遅れているので、私は data.random を公式せずにリリースするかもしれません。 私はまだ決めていません。)
以下のようなプリミティブな乱数生成器群を提供します。
- 一様分布
- (integer size :optional (start 0)) は start から start+size-1 までの間のランダム整数を作る生成器を返します。
- (integer-between lo hi) は lo と hi (両方を含みます)の間のランダムな整数を作る生成器を返します。
- int8、 uint8 などは、その名前が示す範囲を作るための生成器があらかじめ設定されています。
- (char :optional cset) は文字セットからのランダムな文字の生成器を返します。 省略した場合は、デフォルトの文字セットとして #[A-Za-z0-9] を使用します。
- また、 boolean、 real、 real-between もあります。
- 正確な有理数の生成器や複素数生成器を持つようにしたいですが、範囲と分布を指定する方法を迷っています。
- 非一様分布
- 離散的なサンプリングのために幾何分布とポアソン分布があります。
- 連続サンプリングのために、正規分布と指数分布があります。
ついで、これらの生成器はより複雑な生成器を作るために組み合わせることができます。
- 無作為選択
- (one-of generators) は次の値を生成するためにいくつかの生成器の中からひとつの生成器を選ぶ生成器を返します。
- (weighted-sample weight&generators) は各生成器のための選択確率の重みを指定することができます。
- 集合データ型
- (pair-of gen1 gen2), (tuple-of gen ...)
- list-of, vector-of, string-of等。これらのコンビネータは二つの異なる形で呼び出すことができます。 例えば
- (list-of sizer item-gen): sizer は結果のリストの長さを伝えるための整数か整数生成器です。 item-gen は要素を作る生成器です。
- (list-of item-gen): sizer を省略した場合、結果のリストの長さを決定するためにいくつかのデフォルト生成器を使用します。 現在、暫定的に(poisson 4)を使用します。
また、 permutation-of と combination-of もあり、これは (項目の生成器ではなく) 項目のリストをとります。
現在の形について気に入っているのはこれらの生成器も gauche.generator フレームワークの使用と組み合わせることができるということです。 例えばふたつのサイコロの合計の数列を得るには
(gmap + (integer-between 1 6) (integer-between 1 6))
とします。
また、フィルタの適用は
(gfilter (cut < 0 <> 1) (exponential 1))
そして、いくつかの値をリストに入れるには
(generator->list (poisson 5) 10)
API についてまだ熟考しているいくつかの要素があります。
- 生成器を作る手続き(integer, real, char等)と、事前に作成された生成器(例えば fixnum や int8)とがあります。 静的型付けのサポートなしでは、この層の種類は混乱を招く可能性があります。 これらのふたつの層を区別するために、いくつかの命名規則を使用しなければならないでしょうか?
- 別名として複数の名前 (char に対しては chars 等) を提供するというアイデアがあります。 それは、コンビネータと相性が良いです。 例えば (list-of fixnums) や (string-of 5 (chars)) です。 しかしまた、これはうわべだけの利便性でしかなく、単にエクスポートする名前が倍増するだけで何ら機能を付け足さないものでもあります。
- list-of など引数の省略の扱いも Gauche のオプショナル引数の慣例とは異なります。
このモジュールに投入できるデータ生成器のアイデアを持っている場合、私に知らせてください。
今私は、データ生成器としてこのモジュールを使用して、生成的テストフレームワークを書いています。