とりとめのないことを書いております。
by tempurature
カテゴリ
全体
プログラミング
scheme
verilog
未分類
以前の記事
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 03月
お気に入りブログ
PHPで競技プログラミング
メモ帳
最新のトラックバック
ライフログ
検索
タグ
その他のジャンル
ブログパーツ
最新の記事
情報処理技術者試験 お疲れ様..
at 2016-04-17 18:55
基本情報技術者試験 平成27..
at 2016-04-14 04:48
基本情報技術者試験 平成27..
at 2016-04-13 23:03
苦い薬(ハーブ、サプリメント..
at 2016-04-09 14:03
「おバカ度チェックリスト」を..
at 2016-03-24 09:54
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
【racket】林先生が驚く初耳学! の結婚理論をシミュレーションで実証(n=10の場合)
前回の続きです。とりあえずソースコードから。

ソースコード

#lang racket
   
(define (for-each-permutation proc n)
  (define (req header rest)
    (if (null? rest)
        (proc (reverse header))
        (for-each
         (lambda (n)
           (req (cons (list-ref rest n) header)
                (append (take rest n) (drop rest (add1 n)))))
         (range (length rest)))))
  (req empty (range n)))

(define (let-go-and-catch perm t)
  (define tmp-top
    (if (zero? t) -1 (apply max (take (take perm t) t))))
  (define (get-point lst)
    (if (false? lst) 0 (add1 (first lst))))
  (get-point
   (memf (curryr > tmp-top) (drop perm t))))

(define (factorial n) (apply * (range 1 (+ n 1))))

(define (solve-expectation-value t n)
  (let ((sum 0))
    (for-each-permutation
     (lambda (perm) (set! sum (+ (let-go-and-catch perm t) sum))) n)
    (/ sum (factorial n))))

(define (solve-probability-of-the-best t n)
  (let ((sum 0))
    (for-each-permutation
     (lambda (perm)
       (when (= (let-go-and-catch perm t) n) (set! sum (add1 sum)))) n)
    (/ sum (factorial n))))

(define (solve-probability-not-married t n)
  (let ((sum 0))
    (for-each-permutation
     (lambda (perm)
       (when (= (let-go-and-catch perm t) 0) (set! sum (add1 sum)))) n)
    (/ sum (factorial n))))


自分が何番目の異性と結婚することができるかの期待値はsolve-expectation-value関数で算出します。0〜10の範囲のスコアで算出しています(10は一番の相手と結婚、0は未婚)。

t=0: 5.50
t=1: 7.20
t=2: 7.07
t=3: 6.48
t=4: 5.70
t=5: 4.84
t=6: 3.91
t=7: 2.96
t=8: 1.99
t=9: 1.00
t=10: 0.00

期待値だけで見た場合は、「最初の相手は見送って、2人目からは最初の人よりもいいひとなら結婚」するのがいいようです。

自分が出会う10人の人のうち、1番相性のいい人と結婚できる確率はsolve-probability-of-the-best関数で算出します。

t=0: 10.0%
t=1: 28.3%
t=2: 36.6%
t=3: 39.9%
t=4: 39.8%
t=5: 37.2%
t=6: 32.7%
t=7: 26.5%
t=8: 18.9%
t=9: 10.0%
t=10: 0.0%

1番相性のいい人と結婚したい場合、「お付き合いする人を3人見送って、4人目からはそれまでの人比べていい人なら結婚」するのがいいようです。

最後に最後まで未婚で終わってしまう確率を算出しました。

t=0: 0.0%
t=1: 10.0%
t=2: 20.0%
t=3: 30.0%
t=4: 40.0%
t=5: 50.0%
t=6: 60.0%
t=7: 70.0%
t=8: 80.0%
t=9: 90.0%
t=10: 100.0%

この結果は、上の2つに比べて単純です。例えば、1番狙いで3人見送ると未婚になる確率は30%です。1番の相手を探すのって意外にリスキーなのがわかります。


[PR]
by tempurature | 2015-12-23 14:14 | scheme
<< 【Haskell】ペアノ算みた... コード効率と可読性について >>