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