File tree Expand file tree Collapse file tree 4 files changed +75
-3
lines changed Expand file tree Collapse file tree 4 files changed +75
-3
lines changed Original file line number Diff line number Diff line change 25
25
习题完成情况:
26
26
- 章节一: 43/46
27
27
- 章节二: 88/97
28
- - 章节三: 70 /82
28
+ - 章节三: 71 /82
29
29
- 章节四: TODO
30
30
- 章节五: TODO
31
31
* 运行
121
121
122
122
当直接计算π困难时,可通过概率实验间接逼近。
123
123
124
- 这里利用了数论中的概率规律,将π与随机事件联系起来。(对于高数也只是低分飘过的我来说,不知道数论的东西也太正常了 )
124
+ 这里利用了数论中的概率规律,将π与随机事件联系起来。(高数对于我来说已是雪泥鸿爪,更遑论数论的知识了 )
125
125
126
126
#+begin_src racket
127
127
#lang racket
Original file line number Diff line number Diff line change
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
+ )
Original file line number Diff line number Diff line change 1
1
#lang racket
2
2
(require "stream.rkt " )
3
3
(require "exercise3-50.rkt " )
4
+ (require "rand.rkt " )
4
5
5
6
(define (integers-starting-from n)
6
7
(cons-stream n (integers-starting-from (+ n 1 ))))
52
53
int)))
53
54
int)
54
55
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)
56
88
57
89
(module+ test
58
90
(require rackunit)
Original file line number Diff line number Diff line change 21
21
(let ((range (- high low)))
22
22
(+ low (random range))))
23
23
24
+ (provide random-init rand-update)
25
+
24
26
(module+ test
25
27
(require rackunit)
26
28
(require rackunit/text-ui)
You can’t perform that action at this time.
0 commit comments