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 {...@@ -10,8 +10,7 @@ pub fn main() -> %void {
10 var seed_bytes: [@sizeOf(usize)]u8 = undefined;10 var seed_bytes: [@sizeOf(usize)]u8 = undefined;
11 %%os.getRandomBytes(seed_bytes[0...]);11 %%os.getRandomBytes(seed_bytes[0...]);
12 const seed = std.mem.readInt(seed_bytes, usize, true);12 const seed = std.mem.readInt(seed_bytes, usize, true);
13 var rand: Rand = undefined;13 var rand = Rand.init(seed);
14 rand.init(seed);
1514
16 const answer = rand.rangeUnsigned(u8, 0, 100) + 1;15 const answer = rand.rangeUnsigned(u8, 0, 100) + 1;
1716
std/rand.zig+20-16
...@@ -25,8 +25,10 @@ pub const Rand = struct {...@@ -25,8 +25,10 @@ pub const Rand = struct {
25 rng: Rng,25 rng: Rng,
2626
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 }
3133
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,
112114
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 };
115120
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 }
123130
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}
160167
161test "testFloat32" {168test "rand float 32" {
162 var r: Rand = undefined;169 var r = Rand.init(42);
163 r.init(42);170 var i: usize = 0;
164171 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}
171177
172test "testMT19937_64" {178test "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}
179184
180test "testMT19937_32" {185test "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 }