| ... | ... | @@ -25,8 +25,10 @@ pub const Rand = struct { |
| 25 | 25 | rng: Rng, |
| 26 | 26 | |
| 27 | 27 | /// Initialize random state with the given seed. |
| 28 | | pub fn init(r: &Rand, seed: usize) { |
| 29 | | r.rng.init(seed); |
| 28 | pub fn init(seed: usize) -> Rand { |
| 29 | Rand { |
| 30 | .rng = Rng.init(seed), |
| 31 | } |
| 30 | 32 | } |
| 31 | 33 | |
| 32 | 34 | /// Get an integer or boolean with random bits. |
| ... | ... | @@ -110,15 +112,20 @@ fn MersenneTwister( |
| 110 | 112 | array: [n]int, |
| 111 | 113 | index: usize, |
| 112 | 114 | |
| 113 | | pub fn init(mt: &Self, seed: int) { |
| 114 | | mt.index = n; |
| 115 | pub fn init(seed: int) -> Self { |
| 116 | var mt = Self { |
| 117 | .array = undefined, |
| 118 | .index = n, |
| 119 | }; |
| 115 | 120 | |
| 116 | 121 | var prev_value = seed; |
| 117 | 122 | mt.array[0] = prev_value; |
| 118 | | {var i: usize = 1; while (i < n; i += 1) { |
| 123 | var i: usize = 1; |
| 124 | while (i < n; i += 1) { |
| 119 | 125 | prev_value = int(i) +% f *% (prev_value ^ (prev_value >> (int.bit_count - 2))); |
| 120 | 126 | mt.array[i] = prev_value; |
| 121 | | }}; |
| 127 | } |
| 128 | return mt; |
| 122 | 129 | } |
| 123 | 130 | |
| 124 | 131 | pub fn get(mt: &Self) -> int { |
| ... | ... | @@ -158,28 +165,25 @@ fn MersenneTwister( |
| 158 | 165 | } |
| 159 | 166 | } |
| 160 | 167 | |
| 161 | | test "testFloat32" { |
| 162 | | var r: Rand = undefined; |
| 163 | | r.init(42); |
| 164 | | |
| 165 | | {var i: usize = 0; while (i < 1000; i += 1) { |
| 168 | test "rand float 32" { |
| 169 | var r = Rand.init(42); |
| 170 | var i: usize = 0; |
| 171 | while (i < 1000; i += 1) { |
| 166 | 172 | const val = r.float(f32); |
| 167 | 173 | assert(val >= 0.0); |
| 168 | 174 | assert(val < 1.0); |
| 169 | | }} |
| 175 | } |
| 170 | 176 | } |
| 171 | 177 | |
| 172 | 178 | test "testMT19937_64" { |
| 173 | | var rng: MT19937_64 = undefined; |
| 174 | | rng.init(rand_test.mt64_seed); |
| 179 | var rng = MT19937_64.init(rand_test.mt64_seed); |
| 175 | 180 | for (rand_test.mt64_data) |value| { |
| 176 | 181 | assert(value == rng.get()); |
| 177 | 182 | } |
| 178 | 183 | } |
| 179 | 184 | |
| 180 | 185 | test "testMT19937_32" { |
| 181 | | var rng: MT19937_32 = undefined; |
| 182 | | rng.init(rand_test.mt32_seed); |
| 186 | var rng = MT19937_32.init(rand_test.mt32_seed); |
| 183 | 187 | for (rand_test.mt32_data) |value| { |
| 184 | 188 | assert(value == rng.get()); |
| 185 | 189 | } |