(use traversal) (use int-limits) (use srfi-1) ;;;;;;;;;;;;;;;;;;;;;;;;; ;misc (define (normalize val max) (/ val max) ) (define (scanl f init ls) (cons init (if (null? ls) '() (scanl f (f init (first ls)) (rest ls))))) (define (vec-sum v1 v2) (list (+ (first v1) (first v2)) (+ (second v1) (second v2))) ) ;;;;;;;;;;;;;;;;;;;;;;;;; ;rng stuff (define rng_inited #f) (define rng_seed 1) (define (init-rng) (randomize rng_seed) (set! rng_inited #t)) (define (norm-rng) (unless rng_inited (init-rng)) (normalize (random most-positive-integer32) most-positive-integer32)) (define (genrn cnt) (list-tabulate cnt (lambda (i) (norm-rng)))) ;;;;;;;;;;;;;;;;;;;;;;;;; ;random sampling processing (define (p-action-idx rand interval-sizes interval-count) (define (p-action-index_ interval-sizes idx acc) (if (negative? (- acc (first interval-sizes))) idx (p-action-index_ (rest interval-sizes) (+ 1 idx) (- acc (first interval-sizes))) )) (assert (= (length interval-sizes) interval-count) ) (assert (= (sum interval-sizes) 1) ) (p-action-index_ interval-sizes 0 rand)) ;;;;;;;;;;;;;;;;;;;;;;;;; ;simulation procs (define (simu-1d rands) (define (choose-step-1d choice) (assert (<= 0 choice 1) ) (case choice ((0) -1) ((1) 1) )) (let* ((init-pos 0) (p-interval-sizes '(0.5 0.5)) (direction (lambda (rand) (choose-step (p-action-idx rand p-interval-sizes 2)))) (steps (map direction rands)) ) (scanl + init-pos steps))) (define (simu-2d rands) (define (choose-step choice) (assert (<= 0 choice 3) ) (case choice ((0) '(-1 0));left ((1) '( 0 1));up ((2) '( 1 0));right ((3) '( 0 -1)) ));down (let* ((init-pos '(0 0)) (p-interval-sizes '(1/4 1/4 1/4 1/4)) (direction (lambda (rand) (choose-step (p-action-idx rand p-interval-sizes 4)))) (steps (map direction rands)) ) (scanl vec-sum init-pos steps))) ;;;;;;;;;;;;;;;;;;;;;;;;; (define N 10) (define (main) (define rands (genrn N)) ;(simu-1d rands) (simu-2d rands) ) (print (main))