Skip to content

Commit ae47837

Browse files
authored
Merge pull request #486 from amlalejini/fix-random-reset-seed
Fix emp::Random ResetSeed
2 parents 79c4ffc + 4d49782 commit ae47837

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

include/emp/math/Random.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ namespace emp {
8585

8686
weyl_state *= 2; // Make sure starting state is even.
8787

88+
// Reset other internal state
89+
value = 0;
90+
expRV = 0.0;
91+
8892
Get(); // Prime the new sequence by skipping the first number.
8993
}
9094

tests/math/Random.cpp

+46-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ TEST_CASE("Test Random", "[math]")
7171
REQUIRE(b2_result < 50);
7272

7373
emp::RandomStdAdaptor randomStd(rnd);
74-
REQUIRE(randomStd(4) == 1);
74+
REQUIRE(randomStd(4) == 3);
7575

7676
REQUIRE(rnd.GetRandGeometric(1) == 1);
7777
REQUIRE(rnd.GetRandGeometric(0) == std::numeric_limits<uint32_t>::infinity());
@@ -295,3 +295,48 @@ TEST_CASE("Another Test random", "[math]")
295295
REQUIRE(v.first + v.second == 0);
296296
}
297297
}
298+
299+
TEST_CASE("Calling ResetSeed should reset all generator internal state", "[math]") {
300+
301+
SECTION("Test internal 'value'") {
302+
// Get Seed
303+
emp::Random rnd(-1); // Initialize without a seed
304+
rnd.ResetSeed(5);
305+
REQUIRE(rnd.GetSeed() == 5);
306+
307+
emp::vector<int> sequence_a;
308+
for (size_t i = 0; i < 10; ++i) {
309+
sequence_a.emplace_back(rnd.GetInt(10000));
310+
}
311+
312+
rnd.ResetSeed(5);
313+
emp::vector<int> sequence_b;
314+
for (size_t i = 0; i < 10; ++i) {
315+
sequence_b.emplace_back(rnd.GetInt(10000));
316+
}
317+
318+
// Tests internal 'value'
319+
REQUIRE(sequence_a == sequence_b);
320+
}
321+
322+
SECTION("Test internal expV") {
323+
emp::Random rnd(10);
324+
rnd.GetRandNormal(); // Adjusts expV with time-based seed generator
325+
326+
rnd.ResetSeed(4); // Should reset expV
327+
emp::vector<double> norm_seq_a;
328+
for (size_t i = 0; i < 1000; ++i) {
329+
norm_seq_a.emplace_back(rnd.GetRandNormal());
330+
}
331+
332+
rnd.ResetSeed(4);
333+
emp::vector<double> norm_seq_b;
334+
for (size_t i = 0; i < 1000; ++i) {
335+
norm_seq_b.emplace_back(rnd.GetRandNormal());
336+
}
337+
338+
// Tests internal expV
339+
REQUIRE(norm_seq_a == norm_seq_b);
340+
}
341+
342+
}

0 commit comments

Comments
 (0)