続・ユビキタスの街角

ユビキタスの街角(http://tmasui.blogspot.jp/)から引っ越してきました

宝クジのシミュレーションのようなものは 簡単なプログラミングで実験することができる。 以下のような航空機座席問題はどう解けば良いだろうか?
航空機座席問題
  • 100人乗りの飛行機があり,乗客は100人いる
  • 搭乗券には席番号が書かれている
  • 最初に乗った客がチケットをなくしたので適当に座ることにした
  • 次の客は自分の席が空いていればそこに座る,埋まっていたら適当な席に座る.次も同じ...
  • 最後の客が自分の席に座れる確率は?

この答が直感的にわかる人は少ないだろうが、よく考えれば計算して納得することはできる。 しかしシミュレーションすれば大体の答はすぐに判明する。

上の問題はよく考えれば答がわかるのだが、少し変えた以下の問題だとどうだろうか。

航空機座席問題2
  • 100人乗りの飛行機があり,乗客は100人いる
  • 搭乗券には席番号が書かれている
  • 99%の人はきちんと自分の席に座ろうとするのだが、1%の人は空いてる席に勝手に座る
  • 最後の客が自分の席に座れる確率は?
これもシミュレーションすれば答はすぐわかるが、 シミュレーションせずに頭で考えて答を出すことは難しいだろう。

このように、ちょっとしたプログラミングができれば問題をすぐに解けるのにプログラミングできないとわからないままになるような問題は多い気がする。 宝クジのシミュレーションのような世の中のちょっとした疑問や 航空機座席問題のようなクイズを楽しく解きながらプログラミングを勉強するような入門本があればいい気がする。

(こういう問題を Wiki に集めています。 招待URL から登録すれば編集もできるのでご興味ある方はぜひどうぞ)

宝クジの期待値が低いことはよく知られている。「633回年末ジャンボ宝クジ」の資料から計算すると、300円のクジに対して当選金額の期待値は150円ぐらいにしかならないので、宝クジを買うことは激しく損な行為であることは間違いない。

ところが並んでまで宝クジを買う人は沢山いる。得する可能性が著しく低いのに宝クジを買うというのは、それがとても楽しいからだろう。

ジャンボ宝クジを100枚(3万円)買うシミュレーションをしてみると以下のようなことがわかる。
  • 大体数千円ぐらいは当たる (2万円以上損するわけだがゼロになるわけではない)
  • 100回に一回ぐらいは利益が出る
つまり、毎回3万円買っても2万円以上損することがほぼ間違いないのだが、4億円当選を期待するという楽しみがあるし、タマには儲かることがあるし、どれだけ当たっているかを調べる楽しみもあるので、レジャーのような楽しみ方をされているのかもしれない。ギャンブルというよりエンターテインメントなのだろう。

課金ゲームのように、全く儲かる可能性がなくても喜んで金を払う人が沢山いるのだから、滅茶苦茶に分が悪いギャンブルであってもうまく面白さを用意することができれば参加者を集められるということなのだろう。当選金をどれぐらいにするかが大きなノウハウなのだろうか。

ひと昔前に全世界プログラミングという ブログ記事論文 を書いたことがあるのだが、 その後の状況を SIGPX: Special Interest Group on Programming Experienceという勉強会で 発表させてもらった。 言いたいことは特に変わっていないのだが、 安価で高性能なマイコンボードやセンサやプログラミング環境が増えてきたので 手軽に全世界IoTプログラミングができるようになってきたのは確かである。

私の研究室では長年にわたって全世界プログラミングのインフラを整備してきている。 たとえば 橋本翔氏Lindaという並列プログラミングプリミティブを HTTPサーバ上に実装した Node-Lindaというシステムを使うことにより、 以下のような簡単なCoffeeScriptプログラムで研究室のドアを開けられるようになっている。

tuplespace = require('./linda') "masuilab"
tuplespace.write
   type: "door"
   cmd: "open"
   who: "masui"
   where: "delta"
これは「masuilab」という名前の共有空間に 「Delta館の研究室のドアを開けてもらいたい」 という要求データを書き出しているだけであり、 プログラムの作成も意図の理解も極めて容易である。 研究室のマシンは「masuilab」という名前の共有空間を常にモニタしており、 上のようなデータがみつかればサーボモータを回してドアを開けるようになっているので 結果的にドアが開くわけである。 現状では研究室のサーバマシンからArduino経由でサーボモータを回しているが、 ドア開けプログラム側ではそういう実装を気にする必要は無い。

単純で強力なLindaという並列通信機構、 Nodeを使った美しい実装、 記述が簡潔で強力なCoffeeScript、 などの組み合わせによってこのようなプログラミングが可能になったわけであり、 いよいよ全世界プログラミングを誰もが楽しめる状況が整いつつあると思う。 この例はCoffeeScriptであるが、 Node-LindaはブラウザのJavaScriptからでもRubyからでも利用できるので ぜひ使ってみてもらいたいものである。 Node-Lindaの考え方や実装の詳細に関しては 橋本氏の資料 に詳しい。

このページのトップヘ