summaryrefslogtreecommitdiffstats
path: root/randinex.scm
diff options
context:
space:
mode:
Diffstat (limited to 'randinex.scm')
-rw-r--r--randinex.scm44
1 files changed, 20 insertions, 24 deletions
diff --git a/randinex.scm b/randinex.scm
index 1c2b702..e6dc48b 100644
--- a/randinex.scm
+++ b/randinex.scm
@@ -22,28 +22,26 @@
;;; Fixed sphere and normal functions from: Harald Hanche-Olsen
-(define random:float-radix
- (+ 1 (exact->inexact random:MASK)))
-
-;;; This determines how many chunks will be neccessary to completely
-;;; fill up an inexact real.
-(define (random:size-float l x)
- (cond ((= 1.0 (+ 1 x)) l)
- ((= 4 l) l)
- (else (random:size-float (+ l 1) (/ x random:float-radix)))))
-(define random:chunks/float (random:size-float 0 1.0))
-
-(define (random:uniform-chunk n state)
- (if (= 1 n)
- (/ (exact->inexact (random:chunk state))
- random:float-radix)
- (/ (+ (random:uniform-chunk (- n 1) state)
- (exact->inexact (random:chunk state)))
- random:float-radix)))
-
;;; Generate an inexact real between 0 and 1.
-(define (random:uniform state)
- (random:uniform-chunk random:chunks/float state))
+(define random:uniform
+ (letrec ((random:chunks/float ; how many chunks fill an inexact?
+ (letrec ((random:size-float
+ (lambda (l x)
+ (cond ((= 1.0 (+ 1 x)) l)
+ ((= 4 l) l)
+ (else (random:size-float (+ l 1) (/ x 256.0)))))))
+ (random:size-float 0 1.0)))
+
+ (random:uniform-chunk
+ (lambda (n state)
+ (if (= 1 n)
+ (/ (exact->inexact (random:chunk state))
+ 256.0)
+ (/ (+ (random:uniform-chunk (- n 1) state)
+ (exact->inexact (random:chunk state)))
+ 256.0)))))
+ (lambda (state)
+ (random:uniform-chunk random:chunks/float state))))
;;; If x and y are independent standard normal variables, then with
;;; x=r*cos(t), y=r*sin(t), we find that t is uniformly distributed
@@ -81,7 +79,7 @@
;;; For the uniform distribution on the solid sphere, note that in
;;; this distribution the length r of the vector has cumulative
-;;; distribution r^n; i.e., u=r^n is uniform [0,1], so r kan be
+;;; distribution r^n; i.e., u=r^n is uniform [0,1], so r can be
;;; generated as r=u^(1/n).
(define (random:solid-sphere! vect . args)
@@ -95,5 +93,3 @@
(define (random:exp . args)
(let ((state (if (null? args) *random-state* (car args))))
(- (log (random:uniform state)))))
-
-(require 'random)