User loginNavigation |
Functional random numbers without threading stateI was thinking about this problem the other day and came up with what I think is a tenable solution. It's quite possible someone else has thought of this before but I haven't seen it. The idea is very simple: provide the programmer with a function random(x), which deterministically maps real numbers to random values (e.g. a white noise function). Within any function definition (or other code unit), the programmer obtains random numbers by calling the function with different arguments, e.g.: let my_random_data = [random(0), random(1), random(2)] Because random(x) is deterministic, these expressions can be reused at will, returning their original results: let my_random_data = [random(0), random(1), random(2), random(0), random(1), random(2)] Now, to enable modular use of this function, we can simply derive from it a new function, random'(y), whose domain is again the real numbers, but maps to an interval in the domain of random(x), say 0<x<1: let random'(y) = random(atan(y) / pi + 0.5) Now another function or module can use random'(y) in the same manner as the main code used random(x), without fear of duplicating the random sequence. A new derived function can be created for each module which requires its own random function, simply by choosing a different interval of random(x) to map into: let random''(z) = random(atan(z) / pi + 1.5) This process can be repeated within sub-modules, etc. Of course, you can simplify this pattern using a higher-order function, which I will call "delve": let delve(random, index) = (x) -> random(atan(x) / pi + index + 0.5) So an example program might look like: let create_random_data(random') = [random'(0), random'(1), random'(2)] let my_random_data = -> [0.53, 0.12, 0.79, 0.16, 0.08, 0.92, 0.65, 0.50, 0.01] I wrote an OCaml module implementing roughly this interface, albeit over integers, which is available here (interface). It reuses the built-in sequential random number generator, and is optimized for the case when the random function is accessed sequentially. (It must "replay" the random sequence if it is accessed otherwise.) The "delve" function is implemented by using the value from the given random sequence as a seed for a new random sequence. Thoughts? Improvements? By Chris King at 2010-10-08 14:18 | LtU Forum | previous forum topic | next forum topic | other blogs | 4953 reads
|
Browse archives
Active forum topics |
Recent comments
27 weeks 1 day ago
27 weeks 2 days ago
27 weeks 2 days ago
49 weeks 3 days ago
1 year 1 week ago
1 year 3 weeks ago
1 year 3 weeks ago
1 year 5 weeks ago
1 year 10 weeks ago
1 year 10 weeks ago