32 lines
1,013 B
Racket
32 lines
1,013 B
Racket
#lang racket
|
|
(require racket/fixnum)
|
|
(define t (make-parameter 100))
|
|
|
|
(define (Rn v)
|
|
(define (inner-Rn rv idx b-1)
|
|
(define b (fxvector-ref v idx))
|
|
(define rv+ (if (and (= b 1) (= b-1 0)) (add1 rv) rv))
|
|
(if (zero? idx) rv+ (inner-Rn rv+ (sub1 idx) b)))
|
|
(inner-Rn 0 (sub1 (fxvector-length v)) 0))
|
|
|
|
(define ((make-random-bit-vector p) n)
|
|
(for/fxvector
|
|
#:length n ((i n))
|
|
(if (<= (random) p) 1 0)))
|
|
|
|
(define (Rn/n l->p n) (/ (Rn (l->p n)) n))
|
|
|
|
(for ((p (in-list '(1/10 3/10 1/2 7/10 9/10))))
|
|
(define l->p (make-random-bit-vector p))
|
|
(define Kp (* p (- 1 p)))
|
|
(printf "p = ~a\tK(p) =\t~a\t~a~%" p Kp (real->decimal-string Kp 4))
|
|
(for ((n (in-list '(10 100 1000 10000))))
|
|
(define sum-Rn/n (for/sum ((i (in-range (t)))) (Rn/n l->p n)))
|
|
(define sum-Rn/n/t (/ sum-Rn/n (t)))
|
|
(printf "mean(R_~a/~a) =\t~a\t~a~%"
|
|
n n sum-Rn/n/t (real->decimal-string sum-Rn/n/t 4)))
|
|
(newline))
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
(check-eq? (Rn (fxvector 1 1 0 0 0 1 0 1 1 1)) 3))
|