You may find that wrapping a random number generator as a lazy sequence is 
a useful approach - it is functional and works nicely in an idiomatic 
clojure style where you can "take" as many random numbers as you need while 
treating the whole sequence as an immutable value.

I have an (experimental) implementation of this approach in 
core.matrix.stats, see:

https://github.com/clojure-numerics/core.matrix.stats/blob/develop/src/main/clojure/clojure/core/matrix/random.clj

On Wednesday, 29 October 2014 03:08:55 UTC+8, Isaac Karth wrote:
>
> I've been working on some projects (roguelikes, story-generators) that 
> often have a reason to have a random outcome for things like procedurally 
> generating a map. Ideally, they would be deterministically psuduorandom, so 
> that I can generate the same results from the same seed. The part I'm 
> having trouble with is figuring out what method to use to implement this in 
> a functional way.
>
> The naive approach that first occurred to me was to pass a PRNG and seed 
> value into each function. That would certainly keep the functions 
> referentially transparent. But it would also require either rewriting a 
> bunch of functions that don't directly use the randomness themselves or 
> adding the RNG as part of the map that's already being passed. 
>
> Plus, the seed should probably vary (deterministically) between calls to 
> the subfunctions. It's not too useful if all the rooms on a map have the 
> same type because they all pulled their die roll from the same-nth result 
> of the exact same seed. Maybe the seed could be created from the contents 
> of the vector or a UUID of a map object or something?
>
> The other suggestion I've run across is to rebind something like 
> clojure.data.generators/*rnd* for each high-level procedural generation 
> call. I think this requires the generation to be single threaded and 
> otherwise deterministic. At the moment I don't feel like I know enough 
> about how things work under the hood to say if this a good idea or not.
>
> I've poked around at the bigml.sampling and clojure.data.generators 
> libraries, which look useful for dealing with some of this, but I haven't 
> come across anything that directly addresses what kind of architecture to 
> use for deterministic randomness. This may be my inexperience. I feel like 
> I may be a bit too close to the problem, and I can't quite see what the 
> idiomatic answer is. Re-read SICP? Implement some kind of monad? Just bite 
> the bullet and pass the RNG+seed? Find the secret pure functional library 
> everyone is using for repeatable stochastic simulations?
>
> Does anyone have any advice on this? Or prior experience with approaches 
> that work? What are some best practices for approaching deterministic 
> simulations in an idiomatic, functional way?
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to