一昨日から二重だの三重だののループをやってたのは、これがやりたかったからだ。
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
というわけで、無事答えがでた。