blogこの広告は、90日以上更新していないブログに表示しています。statクリスマスパーティーでプレゼント交換を行う。全員、誰かにプレゼントを一つあげ、誰かからプレゼントを一つもらう。参加者は、自分と同じグループに属している人にはプレゼントをあげない。どのグループにも属さない人や、複数のグループに属する人はいない。この条件を満たすようなプレゼント交換が等確率で出るような、プレゼント交換方法生成プログラムを実装せよhttp://d.hatena.ne.jp/Nabetani/20061217#p1という問題が面白そうだったのでやってみました。締め切りはすぎているのですがテストを書いたという人は見受けられないので曝しておきます。問題をやる際にまず考えたのが、最近流行のテストをどう書くか?ということでした。等確率であることをきっちり検証するにはどうやればいいのだろうということで悩みました。(というより悩み中です)先にテストを書いたからか実装は素直にやってしまっているのでパーティーの人数が多くなってしまうとすごく時間がかかってしまうと思います。(10人とかでは試してません)テストデータに一部誤りがあったので訂正します。一つ間違いがあるはず。endendとりあえず統計学のことはかなり忘れてしまっていたのでググって見るとこういったケースではカイ二乗検定を行うのがそれっぽかったのでカイ二乗検定をしてみました。メソッド名はRでカイ二乗検定を行う関数名がchi_squared_testであったのでそれになぞらえておきました。カイ二乗検定は次のような公式で行いますとなります。1回の検定におけるexchange_listメソッドの試行回数が十分に大きければ何回も検定する必要ないかと思いつつも何回もテストを実行してみると結構失敗するので検定も複数回やってとりあえず10%を超えていたら失敗するようにしてみました。ちなみに5人の場合はさすがに待つのがつらそうなので端折りました。ちなみにこのソースコードはいちおう手元のMacBookで1分30秒前後のようです。これでも失敗するときがありますがこれは自分の回答が等確率ではないということを意味しているんだろうか...。いちおうテストが通る方が多いので大丈夫かなとは思っているのですが。本当はもっともう少しコンテキストを書かなければこのプログラムがちゃんと動くとは言えないのだと思われますが、さすがに書くのが疲れたのでこのあたりで。それから今回書いてみて色々とRSpecで書くのはつらいなぁと思えたところとかもありました。(0.should.fail_with_messageとか。case文で分岐したりとかランダムなテストの場合may〜みたいなやつが使えるようになると良いなと思いましたが、さすがにRubyの文法ではそういう拡張はできないですねぇ...。ブロックを使えばそういうテストのためのメソッドを作れそうですが、良さそうな名前が思いつかない。htt...2006-12-21Ruby忘年会Rails勉強会の後はRuby忘年会に参加。(1)はてなブログをはじめよう!walf443さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。