連番の生成
連続する番号が欲しいことがよくあります。少ない数なら単に数字を並べればよいので、大した技巧は要りません。例えば、次のrpn式を使うと1から10までの数字(数列)が縦に表示されます。
1
2
3
4
5
6
7
8
9
10
技巧的な数列生成
10個くらいなら面倒には思いませんが、より多くの数字が欲しくなると大変です。そこで、同じ1から10までの数字を作るにしても、ちょっと技巧を凝らしたのが、次のrpn式です。nレジスタを1ずつ増やす動作を10回繰り返していますね。
1
2
3
4
5
6
7
8
9
10
これは等差数列というもので、数字と数字の差が一定です。上の例では数字と数字が等しく、1ずつ間が開いています。
もっと楽に数列を生成
この等差数列を楽に作り出すことはできないでしょうか。そこで、ユーティリティーパッケージではseqプログラムを用意しました。seqは開始、終了、増分を順に指定することで等差数列を作ってくれます。以下の例で試してみましょう。
1
2
3
4
5
6
7
8
9
10
開始が1、終了が10、増分が1の数列を生成していますね。ちなみに開始を2にして、増分を2にするとどうなるでしょうか。
2
4
6
8
10
2から10までの偶数だけが表示されました。このseqプログラムを使えば、今まで面倒だった数列の作成が簡単にできます。
ちなみに、今までと同様、seqにも横に表示するタイプのプログラムもあります。ダッシュ付きのseq'で、開始、終了、増分の指定はseqと同じです。
2 4 6 8 10
縦が横に変わっただけですから、簡単ですね。
当然ですが、開始、終了、増分はマイナスの数値でも構いません。以下は10から1まで1つずつ数値が小さくなっていく例と、5から-5まで2つずつ小さくなっていく例です。seq'を使ってみましょう。
10 9 8 7 6 5 4 3 2 1
>rpn 5 -5 -2 -c seq'
5 3 1 -1 -3 -5
数列生成の省略形
このseqプログラムですが、より使いやすくするために開始と増分の省略ができるようになっています。まず、増分を省略する例を試してみましょう。
1 2 3 4 5 6 7 8 9 10
このように増分が1の場合、省略することができます。同様に開始が1の場合も省略できます。以下のrpn式でも上の例と同じように、1から10までの数列を生成できます。
1 2 3 4 5 6 7 8 9 10
小数点には注意
開始、終了、増分には小数点を伴った数値も指定することができます。次のrpn式は1から2.5ずつ増加させた場合の数列です。
1
3.5
6
8.5
問題なさそうですね。しかし、次の例を見てください。
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
最後に2が表示されるはずなのですが、表示されていません。これはパソコンが小数点をうまく扱えないからです。小数点の演算を繰り返すとピッタリとした数値にならないことがあるのです。
例えば、数学では0.01を100回足すと1になりますが、パソコンで同じことをすると1にはなりません。従って、小数点を含む場合は、きちんと思ったとおりの数列ができているかを確認する癖を付けたほうがいいでしょう。
上の例にあるような、1から2まで0.1ずつ増加させる数列を作りたい場合は、以下のrpn式を使えば問題はなくなります。
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
整数の数列を作ってから1/10にしていますので、今度はきちんと生成されていることが分かります。
データ分析中にテスト用のデータが欲しいときなど、連番の生成は意外に使うものです。複雑な数列になればプログラムなどで対応するしかありませんが、単純な等差数列ならseqプログラムを使ったほうが圧倒的に早く確実に生成できるので重宝します。
本講座で使用したプログラムは、ユーティリティーパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。