diff --git a/example/guess_number/main.zig b/example/guess_number/main.zig index c58374faa2e8eb22376ca79e341213565ad04879..ff7407e7bf5c81257501126a010c6fcef5a92869 100644 --- a/example/guess_number/main.zig +++ b/example/guess_number/main.zig @@ -10,8 +10,7 @@ pub fn main() -> %void { var seed_bytes: [@sizeOf(usize)]u8 = undefined; %%os.getRandomBytes(seed_bytes[0...]); const seed = std.mem.readInt(seed_bytes, usize, true); - var rand: Rand = undefined; - rand.init(seed); + var rand = Rand.init(seed); const answer = rand.rangeUnsigned(u8, 0, 100) + 1; diff --git a/std/rand.zig b/std/rand.zig index 35f9ac9423d8221216c80e8e102c3e2c4ab4343a..5e990d2ce6ba2aba515709a5248a45c84c7debda 100644 --- a/std/rand.zig +++ b/std/rand.zig @@ -25,8 +25,10 @@ pub const Rand = struct { rng: Rng, /// Initialize random state with the given seed. - pub fn init(r: &Rand, seed: usize) { - r.rng.init(seed); + pub fn init(seed: usize) -> Rand { + Rand { + .rng = Rng.init(seed), + } } /// Get an integer or boolean with random bits. @@ -110,15 +112,20 @@ fn MersenneTwister( array: [n]int, index: usize, - pub fn init(mt: &Self, seed: int) { - mt.index = n; + pub fn init(seed: int) -> Self { + var mt = Self { + .array = undefined, + .index = n, + }; var prev_value = seed; mt.array[0] = prev_value; - {var i: usize = 1; while (i < n; i += 1) { + var i: usize = 1; + while (i < n; i += 1) { prev_value = int(i) +% f *% (prev_value ^ (prev_value >> (int.bit_count - 2))); mt.array[i] = prev_value; - }}; + } + return mt; } pub fn get(mt: &Self) -> int { @@ -158,28 +165,25 @@ fn MersenneTwister( } } -test "testFloat32" { - var r: Rand = undefined; - r.init(42); - - {var i: usize = 0; while (i < 1000; i += 1) { +test "rand float 32" { + var r = Rand.init(42); + var i: usize = 0; + while (i < 1000; i += 1) { const val = r.float(f32); assert(val >= 0.0); assert(val < 1.0); - }} + } } test "testMT19937_64" { - var rng: MT19937_64 = undefined; - rng.init(rand_test.mt64_seed); + var rng = MT19937_64.init(rand_test.mt64_seed); for (rand_test.mt64_data) |value| { assert(value == rng.get()); } } test "testMT19937_32" { - var rng: MT19937_32 = undefined; - rng.init(rand_test.mt32_seed); + var rng = MT19937_32.init(rand_test.mt32_seed); for (rand_test.mt32_data) |value| { assert(value == rng.get()); }