rand: fix needless array allocation in MT19937RNG.u64()

pull/14008/head
Delyan Angelov 2022-04-10 13:02:31 +03:00
parent 3f90809035
commit 6c25f5b291
1 changed files with 5 additions and 4 deletions

View File

@ -144,24 +144,25 @@ pub fn (mut rng MT19937RNG) u32() u32 {
return u32(ans) return u32(ans)
} }
const mag01 = [u64(0), u64(matrix_a)]
// u64 returns a pseudorandom 64bit int in range `[0, 2⁶⁴)`. // u64 returns a pseudorandom 64bit int in range `[0, 2⁶⁴)`.
[inline] [inline]
pub fn (mut rng MT19937RNG) u64() u64 { pub fn (mut rng MT19937RNG) u64() u64 {
mag01 := [u64(0), u64(mt19937.matrix_a)]
mut x := u64(0) mut x := u64(0)
mut i := int(0) mut i := int(0)
if rng.mti >= mt19937.nn { if rng.mti >= mt19937.nn {
for i = 0; i < mt19937.nn - mt19937.mm; i++ { for i = 0; i < mt19937.nn - mt19937.mm; i++ {
x = (rng.state[i] & mt19937.um) | (rng.state[i + 1] & mt19937.lm) x = (rng.state[i] & mt19937.um) | (rng.state[i + 1] & mt19937.lm)
rng.state[i] = rng.state[i + mt19937.mm] ^ (x >> 1) ^ mag01[int(x & 1)] rng.state[i] = rng.state[i + mt19937.mm] ^ (x >> 1) ^ mt19937.mag01[int(x & 1)]
} }
for i < mt19937.nn - 1 { for i < mt19937.nn - 1 {
x = (rng.state[i] & mt19937.um) | (rng.state[i + 1] & mt19937.lm) x = (rng.state[i] & mt19937.um) | (rng.state[i + 1] & mt19937.lm)
rng.state[i] = rng.state[i + (mt19937.mm - mt19937.nn)] ^ (x >> 1) ^ mag01[int(x & 1)] rng.state[i] = rng.state[i + (mt19937.mm - mt19937.nn)] ^ (x >> 1) ^ mt19937.mag01[int(x & 1)]
i++ i++
} }
x = (rng.state[mt19937.nn - 1] & mt19937.um) | (rng.state[0] & mt19937.lm) x = (rng.state[mt19937.nn - 1] & mt19937.um) | (rng.state[0] & mt19937.lm)
rng.state[mt19937.nn - 1] = rng.state[mt19937.mm - 1] ^ (x >> 1) ^ mag01[int(x & 1)] rng.state[mt19937.nn - 1] = rng.state[mt19937.mm - 1] ^ (x >> 1) ^ mt19937.mag01[int(x & 1)]
rng.mti = 0 rng.mti = 0
} }
x = rng.state[rng.mti] x = rng.state[rng.mti]