fixedpoint.jp


Probability puzzle: A certain betをSchemeで解くと (2022-03-09)

Significanceという雑誌には毎号Probability puzzleという確率についてのパズルが出題されます。October 2021号では"A certain bet"と題された裁定取引についての問題が出されました。

解答は比較的簡単に見つかりますが、これが唯一の解であるかどうかという問いは困難です。例えば、賭け金として用意されている99ポンドの一部だけを賭けて利益を出すことが可能かどうか、という疑問があります。

以下のSchemeプログラムが返す結果から、一部を賭けることを許しても解答が唯一であることが分かります。Guileで実行できます。

a-certain-bet.scm
(use-modules (srfi srfi-1))

(define odds '((13/7 9/5 17/10)
               (2/1 7/3 9/4)
               (15/8 19/10 33/17)))

(define (bet i j k x y z)
  (let* ((a (list-ref (car odds) i))
         (b (list-ref (cadr odds) j))
         (c (list-ref (caddr odds) k))
         (den-a (denominator a))
         (den-b (denominator b))
         (den-c (denominator c)))
    (list (+ (* x den-a) (* y den-b) (* z den-c))
          (+ (* x den-a) (* x (numerator a)))
          (+ (* y den-b) (* y (numerator b)))
          (+ (* z den-c) (* z (numerator c))))))

;; https://stackoverflow.com/a/20591545
(define (cartesian-product . lists)
  (fold-right (lambda (xs ys)
                (append-map (lambda (x)
                              (map (lambda (y)
                                     (cons x y))
                                   ys))
                            xs))
              '(())
              lists))

(filter (lambda (v)
          (let ((b (apply bet v)))
            (and (<= (car b) 99)
                 (< (car b) (cadr b))
                 (< (car b) (caddr b))
                 (< (car b) (cadddr b))
                 b)))
        (let ((indice (iota 3))
              (weight (map 1+ (iota 99))))
          (cartesian-product indice indice indice weight weight weight)))

© 2006-2023 fixedpoint.jp