计算机程序的构造和解释 练习题3.5

矩形里面可以刚好包裹一个圆,直径就是长或者宽短的那一个,其实就是利用随机数,在矩形里面打点,概率就是圆形占矩形面积的比率,然后通过面积计算出圆周率。

#lang racket
(define (square x) (* x x))

(define (monte-carlo trials experiment)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))

(define (p x y r)
  (lambda (a b) (<= (+ (square (- a x)) (square (- b y))) (square r))))

(define (min a b)
  (if (> a b) b a))

(define (estimate-integral p x1 x2 y1 y2 trials)
  (define r (min (/ (- x1 x2) 2) (/ (- y1 y2) 2)))
  (define p? (p (/ (+ x1 x2) 2) (/ (+ y1 y2) 2) r))
  (define (test)
    (p? (random-in-range x1 x2) (random-in-range y1 y2)))
  (/ (* (- x1 x2) (- y1 y2) (monte-carlo trials test)) (square r)))
  
(define (random-in-range low high)
  (let ((range (- high low)))
    (+ low (random range))))

(estimate-integral p 2 8 4 10 1000)

运行结果,基本等于3.14

3 13/250
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值