大学祭

ちょっと時間が前後しますが大学時代の話です。

コンピュータ医療研究会として、学園祭に出展したことがあります。ちょうど今の時期だったでしょうか。

入部した段階で潰れかけの部だったのですが、華やかなりし頃には学園祭で「占いプログラム」を出店していたらしいです。占いというと生年月日や血液型などを入力させるわけですが、太古の時代には女性の場合に住所や電話番号まで入力させて、占い(とそれ以外のこと)に利用していたという伝説がありますが本当かどうか・・・

Windowsの開発をしていたおかげで、簡単なユーザーインターフェースとプリンタ周りのコードはすぐに出来ますので、お小遣い稼ぎ(と新たな出会い?)のため出店しました。

生年月日、星座を入力してもらい、占いの文章が表示された紙を印刷します。基本的に真面目に何かを計算するわけではなく、ある意味乱数のようなので文章を作っていきます。

あなたは{
 1.本当は引っ込み思案なのに無理に周囲に合わせている 
 2.自分の中の積極的な部分を出せずにいる 
 3.・・・・
}ですが、・・・

などと文章のテンプレートと、可変部分があり、可変部分を乱数で選んでいきます。最後に、

あなたと相性のいい男性は、・・・・です

という文面が出て、ここには12星座x4つの血液型、の48パターンについて、乱数で合うか合わないかを計算して表示します。

for_each( i in Holoscope){
 for_each( j in Blood_type){
  if(rand() > 0.9) printf( "%s 座の%s型”, i,j);
}}

というコードになるでしょうか。各パターンとの相性が合う確率は10%ですが48パターンあるので普通は5パターンほどが「相性がいい」とされます。

ここで、このようなプログラムを組むに当たり、再現性が必要になります。2回、同じデータを入れて再現性がないのは困ります。これは簡単で、生年月日、血液型をランダムシードとして利用すればいいのです。

普通にライブラリの乱数関数を使えばいいのですが、乱数関数の中身が変わったときに結果が変わるのもイヤかなと思いました。乱数を生成するアルゴリズムいくらでもあるのですが、そのころカオスアトラクターなどに凝っていまして、

f(x)  =  4(x - x^2)

という関数が[0,1]でカオス的な振る舞いをする(数列のように、次々に値を代入していくと予測不能な値の変化をする)ということを知ったばかりでしたので、乱数生成に利用しました。

こうして、学園祭を迎えたところ、ある時に印刷された結果について質問を受けました。

「あなたと相性のいい男性は、です。」としか印刷されていません!

・・・つまり、この人は10%は当たるはずの乱数を、48回くぐりぬけたわけです。1%もないはずですが、高校生の対数の計算には好都合な練習問題でしょうか。

よく考えると、僕が採用したカオス乱数の系列は、0に非常に近い値が来るとしばらくその状態から抜け出せなくなります。なので、偏った結果が出てもおかしくないのかもしれません。

さてそのようなクレーム?を受けて、その場でソースコードを修正しました。どのように修正したかって?簡単な解決法です。どのような状態でも「射手座のO型」は相性のいい相手として無条件に表示するようにしました。これで、少なくとも相性のいい相手が全く表示されないということはなくなりますし、射手座のO型にとっては恋愛のいいとっかかりができることになります・・・実際はそう甘くありませんでした。

ちなみに、そのプログラムは内部的にですが”Uranus.exe”という名前になっていました。占いシステム、というのと惑星の名前にかけたつもりだったのですが。このネーミングセンスが結局HenPitsu(のネーミング)につながることになります。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中