authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-04-18 02:47:10-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-04-18 02:47:10-04:00
log9021bb79695d378a864945f1d398083872ee6530
treedfedd989b325fcaee7bbef08ee79097d05e00753
parenta791417552f200911e534aebe312ab3c527b1a2b

std.rand API follows idiomatic convention for init


2 files changed, 21 insertions(+), 18 deletions(-)

example/guess_number/main.zig+1-2
......@@ -10,8 +10,7 @@ pub fn main() -> %void {
1010 var seed_bytes: [@sizeOf(usize)]u8 = undefined;
1111 %%os.getRandomBytes(seed_bytes[0...]);
1212 const seed = std.mem.readInt(seed_bytes, usize, true);
13 var rand: Rand = undefined;
14 rand.init(seed);
13 var rand = Rand.init(seed);
1514
1615 const answer = rand.rangeUnsigned(u8, 0, 100) + 1;
1716
std/rand.zig+20-16
......@@ -25,8 +25,10 @@ pub const Rand = struct {
2525 rng: Rng,
2626
2727 /// 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 }
3032 }
3133
3234 /// Get an integer or boolean with random bits.
......@@ -110,15 +112,20 @@ fn MersenneTwister(
110112 array: [n]int,
111113 index: usize,
112114
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 };
115120
116121 var prev_value = seed;
117122 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) {
119125 prev_value = int(i) +% f *% (prev_value ^ (prev_value >> (int.bit_count - 2)));
120126 mt.array[i] = prev_value;
121 }};
127 }
128 return mt;
122129 }
123130
124131 pub fn get(mt: &Self) -> int {
......@@ -158,28 +165,25 @@ fn MersenneTwister(
158165 }
159166}
160167
161test "testFloat32" {
162 var r: Rand = undefined;
163 r.init(42);
164
165 {var i: usize = 0; while (i < 1000; i += 1) {
168test "rand float 32" {
169 var r = Rand.init(42);
170 var i: usize = 0;
171 while (i < 1000; i += 1) {
166172 const val = r.float(f32);
167173 assert(val >= 0.0);
168174 assert(val < 1.0);
169 }}
175 }
170176}
171177
172178test "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);
175180 for (rand_test.mt64_data) |value| {
176181 assert(value == rng.get());
177182 }
178183}
179184
180185test "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);
183187 for (rand_test.mt32_data) |value| {
184188 assert(value == rng.get());
185189 }