Random Number Generation
The Scheme Cookbook has a few recipes on random number generation. Why not turn them into a library?
Once upon a time I got bitten by the random number generation bug and did just that. I wrote large parts of the random.plt library available through PLaneT.
"Huh - where exactly?", I hear you say. Well, the library were submitted when PLaneT were in its infancy, so it appears under the 2xx-page. After two major updates since the 200-series no one checks the old libraries (not even the PLT Source Browser), so not surprisingly the random number library is forgotten.
After "porting" (well, I *did* change a single line) it is now available again.
The documentation contains the gory details, so I'll just give a few examples:
The source contains an implementation by Sebastian Egner of a very interesting algorithm. It is the generation of random number following a discrete distribution, which surprisingly can be implemented efficiently.
(random-source-make-discretes s w)
given a source s of random bits in the sense of SRFI-27
and a vector w of n >= 1 non-negative real numbers,
this procedure constructs and returns a procedure rand
such that (rand) returns the next integer x in {0..n-1}
from a pseudo random sequence with
Pr{x = k} = w[k] / Sum(w[i] : i)
for all k in {0..n-1}.
Think about it - how would you implement it?
Once upon a time I got bitten by the random number generation bug and did just that. I wrote large parts of the random.plt library available through PLaneT.
"Huh - where exactly?", I hear you say. Well, the library were submitted when PLaneT were in its infancy, so it appears under the 2xx-page. After two major updates since the 200-series no one checks the old libraries (not even the PLT Source Browser), so not surprisingly the random number library is forgotten.
After "porting" (well, I *did* change a single line) it is now available again.
The documentation contains the gory details, so I'll just give a few examples:
> (require (planet "random.ss" ("schematics" "random.plt" 1 0)))
; Good old Gaussian distribution
> (random-gaussian)
0.7386912134436788
; A "stochastic variable"
> (define X (random-source-make-gaussians default-random-source))
> (X)
0.5826066449247809
> (X)
0.7865269446783535
; Other stuff
> (random-gamma 1)
0.013863292728449427
> (random-permutation 5)
#5(3 1 2 4 0)
> (random-chi-square 1)
1.1334523156657883
The source contains an implementation by Sebastian Egner of a very interesting algorithm. It is the generation of random number following a discrete distribution, which surprisingly can be implemented efficiently.
Think about it - how would you implement it?
0 Comments:
Post a Comment
<< Home