混ぜ合わせ
データを扱うとき、整理する方向に考えることはあっても、乱雑な方向に考えることは希です。データの並べ替えも整理する方向です。整理すればどんなデータがあるか目で確認しやすくなります。
では、逆に乱雑な方向とはどんなものでしょうか。乱雑なデータ=バラバラなデータと考えることができます。まず、整理されたデータを用意して、そのデータをバラバラにしてみましょう。
「@x 1 + #x @x」で数値を1つずつ増やしながら出力します。「-r 10」で10回の繰り返しを指定しています。つまり、上のrpn式で1から10までの連番が作られることになります。data.txtの内容を見てみましょう。
1
2
3
4
5
6
7
8
9
10
このデータをバラバラにするにはどうすればいいでしょうか。意外に面倒なことに気付くと思います。
まずは乱数でバラバラに
例えば、乱雑なデータを作る方法には乱数があります。rpnは乱数を発生させる関数を持っていますので、1から10までの数値を10個バラバラに作ってみます。例えばこんな感じです。
9
9
4
6
2
8
1
10
3
7
「10 ?」で1から10までの数値をランダムに出力して、それを10回繰り返します。確かにバラバラになっていますが、同じ数が出ていますよね(9が2回)。重複なしにバラバラにするのはちょっと面倒な感じです。
重複なしでバラバラに
そこで、ユーティリティーパッケージではshuffleプログラムを用意しています。具体的に実行例を見てみましょう。
2
5
8
1
9
10
6
3
4
7
1から10の連番データをsuffleプログラムに引き渡すと、重複なしにバラバラのデータになっていることが分かりますね。例のごとく、shuffle'プログラムは横一行のデータ用のプログラムです。
4 6 1 2 8 7 3 5 10 9
echoで1から10までの連番の横一行データを作って、それをshuffle'に渡しています(echoについてはdos入門のパイプやpackage入門(カレンダー・システム編)のエコーを参照のこと)。重複なしのバラバラなデータができていますね。echoを使わずに、以下でも同じ結果になります。
9 10 3 5 1 7 4 2 6 8
rpnに1から10までの連番の横一行データを渡して、そのままshuffle'に引き渡しています。もっと短くしたいなら、以下でも可能です。
2 10 6 7 1 8 4 5 3 9
shuffleのようなプログラムはあまり使われないように思いますが、意図的でない抽出(無作為抽出)をするようなときには重宝します。例えば、10名のうちで無作為に3名を選びたいときには上記のrpn式では2番目、10番目、6番目の人を選べばいいわけです。
全ての対象をフォローすることができないサンプル調査などでも、対象を無作為に選ばなければなりません。全数調査はコスト的にも不可能だからです。選挙前に支持政党を電話調査するとき、住人の電話番号は分かっているけど、300人だけをピックアップして調査したいという場合、shuffleはすぐに答えを出してくれます。
shuffle'は150個の数値、shuffleは1000個の数値程度を目安に使用してください。
本講座で使用したプログラムは、ユーティリティーパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。