サイコロの確率の問題をSchemeで解いてみた

一昨日から二重だの三重だののループをやってたのは、これがやりたかったからだ。

 cf. 知恵袋で見つけたサイコロの確率の問題をPythonで解いてみた。 – rscの日記

1個のさいころを3回投げる。1回目に出る目をa1、2回目に出る目をa2、3回目に出る目をa3とし、整数nをn=(a1-a2)(a2-a3)(a3-a1)と定める。このとき、|n|=30である確率を求めよ。

(define triplex
  (lambda (lis)
    (let ((result '()))
      (do ((l1 lis (cdr l1)))
          ((null? l1))
          (do ((l2 lis (cdr l2)))
              ((null? l2))
              (do ((l3 lis (cdr l3)))
                  ((null? l3))
                  (set! result (cons (list (car l1) (car l2) (car l3)) result)))))
                  (reverse result))))

(define check
  (lambda (l)
    (let ((a1 (car l)) (a2 (cadr l)) (a3 (caddr l)))
      (if (= (abs (* (- a1 a2) (- a2 a3) (- a3 a1))) 30)
          #t
          #f))))

(define dice30
  (lambda ()
    (let loop ((s 0) (c 0) (l (triplex '(1 2 3 4 5 6))))
      (cond
        ((null? l) (/ s c))
        ((check (car l)) (loop (+ s 1) (+ c 1) (cdr l)))
        (else (loop s (+ c 1) (cdr l)))))))

(print (dice30))
takatoh@nightschool $ gosh dice30.scm
1/18

というわけで、無事答えがでた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください