我正在做SICP书上的练习3.5。
Racket中的Monte实现生成以下代码:
(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 (random-in-range low high)
(let ((range (- high low)))
(+ low (random range))))
; questão propriamente dita
(define (estimate-integral predicate x1 x2 y1 y2 trials)
(*(* (- x1 x2) (- y1 y2))
(monte-carlo trials predicate)))
(define (circulo?)
(>= 1 (+ (square (random-in-range -1 1))
(square (random-in-range -2 1)))))
(define (estimate-pi)
(estimate-integral circulo? -1.0 1 -2 1 100000))
; Fiquei brincando com os os parametros do retangulo, desde que o circulo continue dentro dele
(define square
(lambda (x) (* x x)))密码是对的但是,我决定插入一些单元测试。
因此,我导入了库rackunit并使用了以下测试:
(require rackunit)
(check-equal? (estimate-pi) 3.00906)这显然是一个问题,测试总是失败的,因为输出是动态的,因为有一个随机函数。
在这种情况下我该怎么办?
发布于 2016-10-18 00:12:33
这里有一个内置的检查,这是首选的解决方案:
(check-= (estimate-pi) 3.1416 1e-4 "Incorrect value for pi")上一次检查验证结果是否在可接受的容忍值(也称为epsilon)范围内,它相当于:
(check-true (<= (abs (- (estimate-pi) 3.1416)) 1e-4))1e-4部分是科学表示法中的公差,它意味着如果实际值和期望值之间的差值小于0.0001,那么我们认为结果是正确的。当然,您可以调整公差值以满足您的需要--数量越小,所需的精度就越高。另外,如果check-=不存在,我们可以定义自己的检查,这一点很有用,如下所示:
(define-binary-check (check-in-tolerance actual expected tolerance)
(<= (abs (- actual expected)) tolerance))
(check-in-tolerance (estimate-pi) 3.1416 1e-4)https://stackoverflow.com/questions/40097480
复制相似问题