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.