2015年11月28日土曜日

昔懐かしい、プロ電のプログラムの技巧

かなり昔の事ですが、プロ電にプログラムを仕込んで「ゲームマシン」にするという本があり、その中に面白い技巧が出ておりました。

1. 「角度スイッチ」をジョイスティック代わりにつかう
2. GRADモードの活用で、乱数ルーチンのステップ数を稼ぐ

まずは、1の方から

1. 「角度スイッチ」をジョイスティック代わりにつかう

今でも、大抵の関数電卓では「DEG」(度)、「RAD」(ラジアン)、「GRAD」(グラード、グラジアン)の3つの角度モードが設定可能ですが、昔のプロ電の中には、三角関数の角度モードをスライドスイッチで切り替えるものがあったそうです。残念ながら、今となっては何と言う機種かは判りません。
このプロ電用に作られたゲームの内容も今となっては不明ではありますが、スクロール(シューティング)ゲームだったのだと思われます。画面(恐らく1行表示)を見ながら、角度モードのスライドスイッチをカチカチと切り替え、自機の操作を行っていたらしい。
スライドスイッチをジョイスティック代わりにするという発想が驚きですが、これにより、キー入力による実行停止がなく、リアルタイム性が向上したのだと推察されます。

角度モードを切り替えるスライドスイッチの状態をどうやって検出するのでしょうか ?
答は簡単で、適当な三角関数値を計算させ、角度モードによって違う値が得られるので、分岐して処理する、という具合です。


2. GRADモードの活用で、乱数ルーチンのステップ数を稼ぐ

GRADモードでは、直角を100とした角度指標となっていて、普段、余り使われない様に思われるGRADモードですが、こんな利用法があった、と言います。
逆三角関数、arc-sin, arc-cos をGRADモードで計算すると、0から100までの数値が返ります。0〜99までの乱数値が必要な場合、内蔵の乱数(0〜1未満)を実行、その逆三角関数値を計算し、最後にround(数値丸め)を実行する事で、0〜99までの乱数値が得られるという手法でした。
通常、こうした場合には乱数値を100倍し整数部を採るという操作を行いますが、100倍するという操作で「×」、「1」、「0」、「0」と、4ステップ余計に喰ってしまいます。メモリの少なかったプロ電では有効だったのかも知れません。

この技法は、38ステップのプログラミングが出来る機種(CASIO fx-3800P)に向けたものでした。今から思うに、38ステップのプログラムでナニが出来たのか、大変考えさせるものがあります。
プログラムで使える命令についても、制御機構は簡単な条件判断(レジスタ・メモリの0判定)と「文頭へ戻る」だけです。それらは、電卓に用意されていた数値積分機能に寄与するもので、積分を計算したい数式を「プログラム」によって実装し、数値積分を行っていたのだと思われます。数値積分は、微分方程式の数値解を得るのにも使われておりました。
そこで、更に「これ使ってゲームも作れるのではないか」という発想で、GRADモードを利用する技巧が編み出されたに相違ありません。

興味深い技巧ではあります。しかし、逆三角関数を通してしまう事で、乱数値の分布に偏りが出たりしないのか、という疑問があります。グラフ電卓で分布を描いて、調べてみましょう。

大抵のプロ電には、一様乱数の機能があります。これをarc-sinに通して、標本を取得します。電卓の実験例なので、100個くらいのデータが丁度良さそうです。
得られる標本の数値範囲は角度モードによりますが、ここでは分布の傾向をみるだけなので、どの角度モードでも構いません。当方、普段はRadianにしているので、Radianならば0~PIの範囲となります。そして、この0~PIの範囲を10の区分にして、棒グラフを描いてみる事にしました。一例では、確かに偏った分布となっております。

更に、統計的にこの分布が偏っているのか、調べる事も出来ます。
推計学の基礎が教える所によりますと、この標本集団から得られるχ自乗値は、近似的にχ自乗分布に従う、との事です。
高機能電卓でも、機能が充実しているものならば、χ自乗分布のCDF(累積分布関数)値を計算できます。これを使って検定も出来るのですが、計算方法は「χ自乗検定」を調べれば割合簡単に判ります。この例の場合、一様乱数と近しいかどうかを検定する事になり、一様分布の「期待値」としては、どの区分も同じ値になっている、として期待値を設定すればよい筈です。

2 件のコメント:

やす (Krtyski) さんのコメント...

akatuki様

制限下でのプログラミングの工夫は、結構好きだったりします。

その意味で、fx-3600 での計算プログラミングの工夫で Gradと arc-tan の応用というのは、なかなか面白いですね。計算の高速化という意味では、fx-5800P のCasio Basic プログラミングでも使えるかも知れません。そもそも、Gradやarc-tanは普段あまり使わないだけに、面白く、こういう発想は素晴らしいですよね。

乱数の検定まで踏み込むのはさすがです。

akatuki さんのコメント...

やす (Krtyski) 様、コンバンワです。

> 制限下でのプログラミングの工夫は、結構好きだったりします。

当方も、制限のあるプロ電での、面白そうな話題だったので、憶えて居ったのです。

> その意味で、fx-3600 での計算プログラミングの工夫で Gradと arc-tan の応用というのは、なかなか面白いですね。

「骨までしゃぶり尽くそう」という姿勢に感銘したので、書いてみたのでした。

> 計算の高速化という意味では、fx-5800P のCasio Basic プログラミングでも使えるかも知れません。そもそも、Gradやarc-tanは普段あまり使わないだけに、面白く、こういう発想は素晴らしいですよね。

仰る通りです !
しかし、今日、こうした手法をただ伝えるだけでは「おかしいんじゃね、コレ」という話までつきまとってきてしまう、そこで、こうした手法を、今日の知見で利用する場合、その内容、実相を確認するために、こんな記事になってしまいました。

> 乱数の検定まで

具体的な手順を出しませんでしたが、高機能電卓を使えば簡単な作業なら出来るという事を言いたくて、オマケです。