2015年11月28日土曜日

祝 ! [e-Gadget] 開設2周年

CASIO fx-5800Pの情報を中心に、CASIO BASICの情報を積極的に発信されておられます やす様のblogが開設2周年との事で、蔭ながらお祝い申し上げます。

e-Gadget - プログラム関数電卓
http://egadget.blog.fc2.com/

やす様のblogでは、最近はCASIO BASIC の構造の詳細を述べられており、その情報を元にSentaro 様が高速動作版 CASIO BASICインタプリタ「C.Basic」の開発を進められております。既にLifeGame がウレシイくらいの速度で動いているらしく、とても興味深い成果なので、fx-9860GIIのユーザーの方は、是非とも御覧頂き度。

以前のポストで「10月にもCASIOがスマートウォッチを発表する」と書きましたが、どうも来年の話になっていた様です。
また、CASIOは電卓50周年のキャンペーンもやっており、既に年表も出していますが、そこには50年記念電卓「S100」も出ているので、年内の新しい高機能電卓は期待出来そうもありません。もうすぐ年末ですから「夢」は来年に持ち越し、にしておきましょう。尤も、CLASSWIZ は昨年12月に発表があったので、ウレシイ「裏切り」があって欲しい気もします。

他方、経営難が続くシャープですが、こんなTweetを出していました。

https://twitter.com/SHARP_JP/status/659206364967780352

ぜ…全国の 高校生よ 高専生よ そしてその親御さんの みなさま……このオラに ほんのちょっとずつだけ 弊社の電子辞書とか関数電卓を採用する圧力を…学校にかけてくれ…!!!

高校生向けの関数電卓だそうです。

http://www.sharp.co.jp/calc/lineup/education.html

惜しむらくはプロ電ではない所でありますが、今のSharpの企画力では、こんな所から始めるのが精一杯なのかも知れません。しかし、発売は来年2月となっております。それまで持つのか !?
いや、それこそ「来年の事を言うと鬼がナントカ」とか申しますから、CASIOの新製品と共に、静観します。

さて、CASIO機ばかりではマズいので、HP機の話題も。JulyさんのAmazon売り場のHP50G, HP Primeですが、最近になって猛烈にバイが進んでいる様子。特にHP Primeは残り5台。もうすぐクリスマスという事で、高機能電卓のお買い求めを。

「すり抜け」確率の研究


火砕流に遭遇する確率に関するTweet

https://twitter.com/HayakawaYukio/status/658584031123107841
1万年で火砕流90%は、人生100年とすれば、一生の間に遭遇する確率(すなわち火砕流で死ぬ確率)は0.9%だ。そんなに小さくない
「1万年で90%」という事から、100年では90%/100 = 0.9% という目安を出しておりますが、確率計算の上では、どうなのでしょうか。
早川センセは、発生(火砕流に遭遇)する確率をp=一定としている様ですから、ここでも、その前提で計算を進めようと思います。

「1万年で90%の確率」とは言いますが、そのうちの「人生100年」は、1万年の1/100期間であります。
そこで、この「人生100年」を1回の施行とすれば、「1万年」は100回分の施行と考えてよいでしょう。
ここまで単純化して、いよいよ本題です。
100回(=1万年)の施行で90%となる発生確率の場合、1回(=人生100年)の試行による確率がどの程度になるのか、という問題に還元される事となりましょうや。

これを考える為に、複数回試行の確率を考えます。まず,最初は2回の試行から始めましょう。

p=2/3 という確率で生じる事象があるとして、1回で生じる確率は2/3であり、生じない確率は1/3である事に議論の余地はないでしょう。それでは、2回ではどうでしょうか ?

最初の1度目で生じる確率は2/3, 次に生じる確率も2/3 でありますが、ここには、次の組み合わせがあります。

1度目 2度目 確率
生じる 生じる 2/3 * 2/3 = 4/9
生じる 生じない 2/3 * 1/3 = 2/9
生じない 生じる 1/3 * 2/3 = 2/9
生じない 生じない 1/3 * 1/3 = 1/9

2回の事象に於ける「組み合わせ」では、実に8/9の場合が「生じる」を含んでいる勘定になります。
すなわち、2回の施行において「全く生じない」場合は1/9であり、いつの時点で起こるかを特定しない「起こる」確率は、全体の「全く生じない」場合を除いた場合として考える事が出来、その確率は 1-p = 1-1/9 = 8/9 と計算できます。

さて、この部分をもう少し考えてみます。
2回の施行で「全く起こらない」確率は、1/3*1/3 = 1/9 でしたが、つぎの様に考えてもいいでしょう。

n回の試行で「全く起こらない」確率は、p = (1/3)^n
n回の試行で「1度以上起こりうる」確率は、q = 1-p = 1-(1/3)^n

これをより一般的な表現とするならば、1回の試行で発生する確率を P として、

n回の試行で「全く起こらない」確率は、p = (1-P)^n
n回の試行で「1回以上起こりうる」確率(pの余事象)は、q = 1-p = 1-(1-P)^n

という、少し込み入った表式を得ます。
ここでは複数回の施行で発生しなかった事を「n回の試行をすり抜けて来た」と考え、「すり抜けの確率」と呼称します。

この辺りの考えをまとめて、件の「火砕流に遭遇しない確率」を、今一度考えなおそうというコンタンです。
100回の施行で90%の遭遇確率とは、100回の間、遭遇せずに「すり抜けて来た」確率の余事象ですから、

0.9 = 1-(1-P)^100

となります。但し、Pは「1回で火砕流に遭遇する確率」です。関数電卓をチョイチョイと叩けば、Pの値はたちどころに得られます。

1-P = (1-0.9)^(1/100) = 0.977237221...

P = 1-0.977237221 = 0.022762779, およそ2.28% という値が得られました。
0.9%よりも大きい値で、センセの仰る通り「そんなに小さい値ではない」とは言えます。
一方、危険率を5%に採ってしまうと、「2.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(累積分布関数)値を計算できます。これを使って検定も出来るのですが、計算方法は「χ自乗検定」を調べれば割合簡単に判ります。この例の場合、一様乱数と近しいかどうかを検定する事になり、一様分布の「期待値」としては、どの区分も同じ値になっている、として期待値を設定すればよい筈です。