|
1 | 1 | (ns provisdom.apache-math.alternative-random |
| 2 | + "Alternative random number generators from Apache Commons Math. |
| 3 | + |
| 4 | + Provides specialized random number generators beyond basic uniform random: |
| 5 | + - Quasi-random sequences with better coverage (Sobol sequences) |
| 6 | + - Cryptographically secure random numbers (ISAAC) |
| 7 | + - Fast, high-quality pseudorandom numbers (Mersenne Twister) |
| 8 | + |
| 9 | + Example usage: |
| 10 | + (def quasi-seq (quasi-rnd-vector-lazy 2)) |
| 11 | + (take 3 quasi-seq) ;=> [[0.0 0.0] [0.5 0.5] [0.75 0.25]]" |
2 | 12 | (:require |
3 | 13 | [clojure.spec.alpha :as s] |
4 | 14 | [clojure.spec.gen.alpha :as gen] |
|
27 | 37 |
|
28 | 38 | ;;;APACHE RANDOM NUMBER GENERATORS |
29 | 39 | (defn quasi-rng |
30 | | - "Creates an Apache RNG with better coverage but more predictable through a |
31 | | - lazy sequence of vectors of size `dimensions`. Because of predictability, can |
32 | | - be better for a single use simulation." |
| 40 | + "Creates a Sobol quasi-random number generator for improved uniform coverage. |
| 41 | + |
| 42 | + Quasi-random sequences provide better distribution coverage than pseudorandom |
| 43 | + sequences, making them ideal for Monte Carlo simulations and numerical integration. |
| 44 | + However, they are more predictable and should not be used for cryptographic purposes. |
| 45 | + |
| 46 | + Parameters: |
| 47 | + dimensions - number of dimensions for each generated vector (1-1000) |
| 48 | + |
| 49 | + Returns Apache Commons SobolSequenceGenerator instance. |
| 50 | + |
| 51 | + Example: |
| 52 | + (def qrng (quasi-rng 2)) |
| 53 | + (.nextVector qrng) ;=> [0.0 0.0]" |
33 | 54 | [dimensions] |
34 | 55 | (SobolSequenceGenerator. ^long dimensions)) |
35 | 56 |
|
|
38 | 59 | :ret ::apache-rng) |
39 | 60 |
|
40 | 61 | (defn quasi-rnd-vector-lazy |
41 | | - "Better coverage but more predictable through a lazy sequence of vectors of |
42 | | - size `dimensions`. Because of predictability, can be better for a single use |
43 | | - simulation." |
| 62 | + "Returns lazy sequence of quasi-random vectors with improved coverage. |
| 63 | + |
| 64 | + Generates an infinite lazy sequence of vectors using Sobol quasi-random sequences. |
| 65 | + Each vector contains `dimensions` numbers in [0,1). Provides better uniform |
| 66 | + coverage than pseudorandom sequences, making it superior for Monte Carlo methods. |
| 67 | + |
| 68 | + Parameters: |
| 69 | + dimensions - size of each vector (1-1000) |
| 70 | + |
| 71 | + Returns lazy sequence of vectors with quasi-random numbers. |
| 72 | + |
| 73 | + Example: |
| 74 | + (take 3 (quasi-rnd-vector-lazy 2)) |
| 75 | + ;=> [[0.0 0.0] [0.5 0.5] [0.75 0.25]]" |
44 | 76 | [dimensions] |
45 | 77 | (let [qr (quasi-rng dimensions)] |
46 | 78 | (repeatedly #(vec (.nextVector ^SobolSequenceGenerator qr))))) |
|
50 | 82 | :ret (s/every ::rnd-vector)) |
51 | 83 |
|
52 | 84 | (defn secure-rng |
53 | | - "Creates an Apache RNG that is less predictable but slower RNG than Mersenne |
54 | | - Twister." |
| 85 | + "Creates cryptographically secure random number generator using ISAAC algorithm. |
| 86 | + |
| 87 | + ISAAC (Indirection, Shift, Accumulate, Add, and Count) provides cryptographically |
| 88 | + secure random numbers suitable for security applications. Slower than Mersenne |
| 89 | + Twister but much less predictable. |
| 90 | + |
| 91 | + Parameters: |
| 92 | + seed - long integer seed for reproducible sequences |
| 93 | + |
| 94 | + Returns Apache Commons ISAACRandom instance. |
| 95 | + |
| 96 | + Example: |
| 97 | + (def secure-gen (secure-rng 12345)) |
| 98 | + (.nextDouble secure-gen) ;=> 0.26673862796330083" |
55 | 99 | [seed] |
56 | 100 | (ISAACRandom. ^long seed)) |
57 | 101 |
|
|
60 | 104 | :ret ::apache-rng) |
61 | 105 |
|
62 | 106 | (defn secure-rnd-lazy |
63 | | - "A less predictable but slower rnd-lazy than Mersenne Twister." |
| 107 | + "Returns lazy sequence of cryptographically secure random numbers. |
| 108 | + |
| 109 | + Generates an infinite lazy sequence of random doubles in [0,1) using the ISAAC |
| 110 | + algorithm. Provides cryptographic security but at the cost of performance. |
| 111 | + Each call creates a new generator instance. |
| 112 | + |
| 113 | + Parameters: |
| 114 | + seed - long integer seed for reproducible sequences |
| 115 | + |
| 116 | + Returns lazy sequence of secure random doubles. |
| 117 | + |
| 118 | + Example: |
| 119 | + (take 5 (secure-rnd-lazy 42)) |
| 120 | + ;=> (0.123... 0.456... 0.789...)" |
64 | 121 | [seed] |
65 | 122 | (repeatedly #(.nextDouble ^ISAACRandom (secure-rng seed)))) |
66 | 123 |
|
|
69 | 126 | :ret ::rnd-lazy) |
70 | 127 |
|
71 | 128 | (defn mersenne-rng |
72 | | - "Creates an Apache RNG using `seed`." |
| 129 | + "Creates Mersenne Twister random number generator. |
| 130 | + |
| 131 | + Mersenne Twister is a fast, high-quality pseudorandom number generator with |
| 132 | + excellent statistical properties and a very long period (2^19937-1). Suitable |
| 133 | + for most simulation work but not cryptographically secure. |
| 134 | + |
| 135 | + Parameters: |
| 136 | + seed - long integer seed for reproducible sequences |
| 137 | + |
| 138 | + Returns Apache Commons MersenneTwister instance. |
| 139 | + |
| 140 | + Example: |
| 141 | + (def mt-gen (mersenne-rng 12345)) |
| 142 | + (.nextDouble mt-gen) ;=> 0.8335762378570932" |
73 | 143 | [seed] |
74 | 144 | (MersenneTwister. ^long seed)) |
75 | 145 |
|
|
78 | 148 | :ret ::apache-rng) |
79 | 149 |
|
80 | 150 | (defn mersenne-rnd-lazy |
81 | | - "Returns rnd-lazy using `seed`." |
| 151 | + "Returns lazy sequence of high-quality pseudorandom numbers. |
| 152 | + |
| 153 | + Generates an infinite lazy sequence of random doubles in [0,1) using the |
| 154 | + Mersenne Twister algorithm. Provides excellent statistical properties and |
| 155 | + performance for most simulation needs. Each call creates a new generator instance. |
| 156 | + |
| 157 | + Parameters: |
| 158 | + seed - long integer seed for reproducible sequences |
| 159 | + |
| 160 | + Returns lazy sequence of pseudorandom doubles. |
| 161 | + |
| 162 | + Example: |
| 163 | + (take 5 (mersenne-rnd-lazy 42)) |
| 164 | + ;=> (0.833... 0.150... 0.271...)" |
82 | 165 | [seed] |
83 | 166 | (repeatedly #(.nextDouble ^MersenneTwister (mersenne-rng seed)))) |
84 | 167 |
|
|
0 commit comments