I'm writing an agent-based simulation framework, in which agents are Clojure records called Persons. There are 40-100 persons at present, but conceivably the number could go up to 1000. In each timestep, Persons' states are functionally updated by mapping update functions across the collection of Persons. The application is designed to be able to run in a single thread, or to be run in multiple threads, depending on whether I do the mapping using map or pmap. (The application is generally faster with pmap (and all I had to do was add "p"), but I think there might be contexts in which single-threaded operation is preferable.)
At one point in the Person-update process, each Person randomly samples a small number (1 to 50) of elements from some small collections (size 10 up to the max number of persons). When the application is multi-threaded, I'd rather not have separate threads accessing the same random number generator. (Java 1.7 allows a way of dealing with that, but for now I'd rather be compatible with Java 1.6 as well.) Does the following solution make sense? 1. During initialization, I'll get a random number generator from java.util.Random, initialized with the system time or something else that varies. 2. I'll give each person a field :rng, and will initialize each one with a sparate call to java.util.Random, with a seed determined by the RNG mentioned in the previous line. (After this I can let the inititial RNG to be garbage collected.) 3. During the steps in which each Person needs to sample from collections, the code will get the RNG from the Person's :rng file, and use it to determine what elements are sampled. There is more than one way that I could implement step 3. Here are some options I'm considering: (a) Bind data.generators/*rnd* to the RNG, and then call functions in data.generators <http://clojure.github.io/data.generators/>. (b) Pass the Person's RNG to functions from bigml/sampling <https://github.com/bigmlcom/sampling> (which allow you to pass in an RNG). (c) Write my own sampling functions that use the RNG from the Person. Further remarks: When the application is single-threaded, each Person will use a different RNG, which isn't necessary, but it won't hurt, since the RNGs will have different seeds, except that I waste memory by creating multiple RNGs. When the application is multi-threaded, I still don't need one RNG per person, strictly speaking, since the number of threads will be much less than the number of Persons. However, giving each Person its own RNG is simpler. It means that my code can ignore threads and let Clojure figure out how to manage them. What do you think? Thanks in advance for any help. -- 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.