Skip to content

Commit 5642fa6

Browse files
committed
Add implementation of exercise 3-81
1 parent 292848a commit 5642fa6

File tree

4 files changed

+75
-3
lines changed

4 files changed

+75
-3
lines changed

README.org

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 70/82
28+
- 章节三: 71/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行
@@ -121,7 +121,7 @@
121121

122122
当直接计算π困难时,可通过概率实验间接逼近。
123123

124-
这里利用了数论中的概率规律,将π与随机事件联系起来。(对于高数也只是低分飘过的我来说,不知道数论的东西也太正常了)
124+
这里利用了数论中的概率规律,将π与随机事件联系起来。(高数对于我来说已是雪泥鸿爪,更遑论数论的知识了)
125125

126126
#+begin_src racket
127127
#lang racket

chapter3/exercise3-81.rkt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#lang racket
2+
(require "stream.rkt")
3+
(require "rand.rkt")
4+
5+
(define (random-stream requests seed)
6+
(if (stream-null? requests)
7+
the-empty-stream
8+
(let ((request (stream-car requests))
9+
(rest-requests (stream-cdr requests)))
10+
11+
(cond ((eq? 'generate request)
12+
(let ((next-random (rand-update seed)))
13+
(cons-stream next-random
14+
(random-stream rest-requests next-random))))
15+
16+
((and (pair? request) (eq? 'reset (car request)))
17+
(let ((new-seed (cadr request)))
18+
(random-stream rest-requests new-seed)))
19+
20+
(else
21+
(random-stream rest-requests seed))))))
22+
23+
(module+ test
24+
(require rackunit)
25+
26+
(test-case "Test for random-stream"
27+
(define requests (list-to-stream '(generate
28+
generate
29+
generate
30+
(reset 42)
31+
generate
32+
generate
33+
generate
34+
generate)))
35+
(define random-numbers (random-stream requests 42))
36+
(check-equal? (stream-take-n random-numbers 8) '(2027382 1226992407 551494037 2027382 1226992407 551494037 961371815))
37+
)
38+
)

chapter3/infinite-stream.rkt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#lang racket
22
(require "stream.rkt")
33
(require "exercise3-50.rkt")
4+
(require "rand.rkt")
45

56
(define (integers-starting-from n)
67
(cons-stream n (integers-starting-from (+ n 1))))
@@ -52,7 +53,38 @@
5253
int)))
5354
int)
5455

55-
(provide add-streams scale-stream ones integers fibs interleave pairs integral)
56+
(define random-number-stream
57+
(cons-stream random-init
58+
(stream-map rand-update random-number-stream)))
59+
60+
(define (map-successive-pairs f s)
61+
(cons-stream
62+
(f (stream-car s) (stream-car (stream-cdr s)))
63+
(map-successive-pairs f (stream-cdr (stream-cdr s)))))
64+
65+
(define cesaro-stream
66+
(map-successive-pairs (lambda (r1 r2) (= (gcd r1 r2) 1))
67+
random-number-stream))
68+
69+
(define (monte-carlo experiment-stream passed failed)
70+
(define (next passed failed)
71+
(cons-stream
72+
(/ passed (+ passed failed))
73+
(monte-carlo
74+
(stream-cdr experiment-stream)
75+
passed
76+
failed)))
77+
(if (stream-car experiment-stream)
78+
(next (+ passed 1) failed)
79+
(next passed (+ failed 1))))
80+
81+
(define pi-stream
82+
(stream-map (lambda (p) (sqrt (/ 6 p)))
83+
;; bypass division by zero problem
84+
(stream-filter (lambda (p) (not (= p 0)))
85+
(monte-carlo cesaro-stream 0 0))))
86+
87+
(provide add-streams scale-stream ones integers fibs interleave pairs integral monte-carlo)
5688

5789
(module+ test
5890
(require rackunit)

chapter3/rand.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
(let ((range (- high low)))
2222
(+ low (random range))))
2323

24+
(provide random-init rand-update)
25+
2426
(module+ test
2527
(require rackunit)
2628
(require rackunit/text-ui)

0 commit comments

Comments
 (0)