Advertisement
timothy235

sicp-3-5-5-modularity-of-functional-programs-and-objects

Mar 8th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 2.42 KB | None | 0 0
  1. #lang racket
  2. (require "3-5-streams.rkt")
  3.  
  4. ;;;;;;;;;;
  5. ;; 3.81 ;;
  6. ;;;;;;;;;;
  7.  
  8. (define (make-prng seed)
  9.   (define (rand-update x)
  10.     (remainder (+ 11 (* 23 x)) 493))
  11.   (define (random-stream request-stream x0)
  12.     (define m0 (stream-car request-stream))
  13.     (define x1
  14.       (cond [(eq? m0 'generate) (rand-update x0)]
  15.             [(eq? m0 'reset) seed]
  16.             [else (error "Unknown request -- PRNG:" m0)]))
  17.     (cons-stream x0
  18.                  (random-stream (stream-cdr request-stream)
  19.                                 x1)))
  20.   (lambda (ms) (random-stream ms seed)))
  21.  
  22. ;; TEST
  23.  
  24. (define example-request-stream
  25.   ; Reset every fourth request.
  26.   (my-stream-map (lambda (x)
  27.                    (if (zero? (remainder x 4))
  28.                      'reset
  29.                      'generate))
  30.                  integers))
  31.  
  32. (define rand-stream ((make-prng 10) example-request-stream))
  33.  
  34. (display-this-many 10 rand-stream)
  35. ;; 10 241 131 66 10 241 131 66 10 241
  36. ;; 'done
  37.  
  38. ;;;;;;;;;;
  39. ;; 3.82 ;;
  40. ;;;;;;;;;;
  41.  
  42. (define (monte-carlo experiment-stream passed failed)
  43.   (define (next passed failed)
  44.     (cons-stream
  45.       (exact->inexact (/ passed (+ passed failed)))
  46.       (monte-carlo
  47.         (stream-cdr experiment-stream) passed failed)))
  48.   (if (stream-car experiment-stream)
  49.     (next (add1 passed) failed)
  50.     (next passed (add1 failed))))
  51.  
  52. (define (inexact-random low high)
  53.   (+ low (* (random) (- high low))))
  54.  
  55. (define (estimate-integral predicate x1 x2 y1 y2)
  56.   (define (rand-update . args)
  57.     ; Produce a random pair in the right ranges when applied to any argument.
  58.     (list (inexact-random x1 x2)
  59.           (inexact-random y1 y2)))
  60.   (define area (* (- x2 x1) (- y2 y1)))
  61.   (define random-pairs
  62.     (cons-stream (rand-update)
  63.                  (my-stream-map rand-update
  64.                                 random-pairs)))
  65.   (define experiment-stream
  66.     (my-stream-map (lambda (pr) (apply predicate pr))
  67.                    random-pairs))
  68.   (scale-stream (monte-carlo experiment-stream 0 0) area))
  69.  
  70. (define (in-unit-circle? x y)
  71.   (< (+ (sqr x)
  72.         (sqr y))
  73.      1))
  74.  
  75. (define pi-stream (estimate-integral in-unit-circle? -1 1 -1 1))
  76.  
  77. (my-stream-ref pi-stream 100)
  78. ;; 3.00990099009901
  79. (my-stream-ref pi-stream 1000)
  80. ;; 3.1888111888111887
  81. (my-stream-ref pi-stream 10000)
  82. ;; 3.1632836716328367
  83. (my-stream-ref pi-stream 100000)
  84. ;; 3.153968460315397
  85. (my-stream-ref pi-stream 1000000)
  86. ;; 3.1423408576591423
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement