<- Back

●幽霊探知スクリプト


僕がCG業界に入ったばかりの頃の話です。美大出身の僕は、会社に入るまでコンピュータに触ったことすらありませんでした。今ではコンピュータを触ったことがない人間がいきなりCG会社に入るなんて信じられない話ですが、CGの学校がほとんど無かった20年前は普通のことでした。OSも今のようにGUIなんて便利なのは無く、UNIXをいちから覚える必要がありました。

その頃、会社の先輩のひとりに、シェルプログラミングで仕事とは全然無縁のスクリプトをやたら書いていた人がいたんですね。 出前でとった食事のお金の清算をするスクリプトとか。僕のスクリプト経験はそんな仕事とは無関係のちょっと面白そうなスクリプトの中身を覗くことから始まりました。その後プログラマーから色々教わったりしながら、社内のゴシップ記事を投稿する秘密の掲示板なんかを作ったりしてました(笑)。

堅苦しくない、遊び感覚でスクリプトが覚えられるといいですよね。下記のスクリプトは、自分の近くにいる幽霊を探知するためのMayaのMELスクリプトです(笑)。僕の以前のウェブサイトで公開していたこともありましたが、そのときは幽霊の存在を絵で示したり、ちょっとしたGUIがついていてこれよりは手の込んだ代物でしたが、今回のはそこからGUIの要素を省いて、スクリプト入門者でも理解できるように簡略化しています。こんなものでどうして幽霊の存在がわかるかと思われるでしょうが、まあ一種のシャレだと思ってください。とは言っても全然根拠の無いものではなく、一応それらしいアルゴリズムはあります。

このスクリプトのメインの機能は、たくさんの整数をランダムに発生させ、偶数と奇数の発生比率を計算するというものです。サイコロを何万回も振る様子をイメージしてもらえるとわかりやすいと思います。サイコロをたくさん振れば振るほど偶数と奇数の出る比率は50%ずつに収束していきます。しかし近くに幽霊がいると、磁界に変化が起きてコンピュータに影響を及ぼし、コンピュータが発生させる偶数と奇数の比率に大きな差が出るらしいんですね。ということを何かで聞いた気がして、こんなスクリプトを作ってみました。

//幽霊探知MELスクリプト

// 探査制度を指定します。 0: 低、1:中、2:高

int $mode = 0;

// 変数の宣言と初期化

int $n, $v;
float $mod, $h;
int $even = 0;
int $odd = 0;

// 探査制度ごとに乱数発生の数を指定

switch($mode) {
   case 0:
      $n = 1000;
      break;
   case 1:
      $n = 10000;
      break;
   case 2:
      $n = 1000000;
      break;
}

// 乱数の発生と偶数・奇数のカウント

for($i = 0; $i < $n; $i++) {
   $v = rand(0, $n);
   $mod = fmod($v, 2);
   if($mod == 0) {
      $even++;
   }
   else {
      $odd++;
   }
}

// 発生比率の差を計算

$h = abs($even-$odd)/$n*100;

print("偶数: "+$even+", 奇数: "+$odd+", 差="+$h+"%\n");
ちょっと余談になりますが、僕が幽霊探知スクリプトを作ったのはMELが最初ではなく、実ははるか昔、まだアップルのMacに標準で「ハイパーカード」というマルチメディアオーサリングツールがバンドルされていた頃で、そのハイパーカードを使って作ったのが最初です。旅行先に幽霊探知スクリプトを入れたノート型Macを持って行き、旅館でサーチしてみるといった具合です。

さて、このスクリプトを実行すると

偶数: 490, 奇数: 510, 差=2%
これは、1000個発生した整数のうち、490個が偶数で奇数が510個、発生率の差が1000のうちの20で、つまり2%という意味です。偶数・奇数が何個出るかは実行のたびに違うので、みなさんがやった場合はこれと異なる数値になっていると思います。実はこのスクリプトは探査制度を低・中・高の3段階で変更することができ、デフォルトは低になっています。一応探査制度があがるほど、信用度があがるということにしています。探査制度が低いと、奇数・偶数の発生率の差が幽霊がいなくとも結構出ます。上記の結果では2%の差ですが、わりと5%くらいの差は出ます。探査制度を高にすると、通常0.001%〜0.2%くらいの差に収まります。なので低の場合は10%、高の場合は0.5%以上の差が出ると、かなりヤバイと言えるでしょう。


<- Back