2626
2727#include " tools/cpp/runfiles/runfiles.h"
2828#include " absl/flags/flag.h"
29+ #include " absl/log/check.h"
2930#include " absl/log/log.h"
3031#include " absl/strings/match.h"
3132#include " absl/strings/numbers.h"
3738using bazel::tools::cpp::runfiles::Runfiles;
3839
3940ABSL_FLAG (bool , fixed_seed, true ,
40- " Use a fixed seed for random number generation." );
41+ " Use a fixed seed for random number generation. The seed can be "
42+ " specified with the --seed flag; the default is 0. If "
43+ " --fixed_seed=false, random seeds are used." );
44+ ABSL_FLAG (std::optional<int >, seed, {},
45+ " Seed for random number generation. Requires --fixed_seed=true." );
4146
4247ABSL_FLAG (std::optional<int >, L1_data_size, {},
4348 " Size of the L1 data cache in bytes. Determined automatically if the "
@@ -54,13 +59,21 @@ namespace fleetbench {
5459using CacheInfo = benchmark::CPUInfo::CacheInfo;
5560
5661Random& Random::instance () {
57- static auto * instance = new Random (absl::GetFlag (FLAGS_fixed_seed));
62+ static auto * instance = [] {
63+ if (absl::GetFlag (FLAGS_seed).has_value ()) {
64+ CHECK (absl::GetFlag (FLAGS_fixed_seed))
65+ << " --seed requires --fixed_seed=true" ;
66+ }
67+ return new Random (absl::GetFlag (FLAGS_fixed_seed),
68+ absl::GetFlag (FLAGS_seed).value_or (0 ));
69+ }();
5870 return *instance;
5971}
6072
61- Random::Random (bool fixed_seed) : fixed_seed_(fixed_seed) {
73+ Random::Random (bool fixed_seed, int seed)
74+ : fixed_seed_(fixed_seed), seed_(seed) {
6275 if (fixed_seed_) {
63- rng_.seed (0 );
76+ rng_.seed (seed_ );
6477 } else {
6578 std::random_device rd;
6679 rng_.seed (rd ());
@@ -69,7 +82,7 @@ Random::Random(bool fixed_seed) : fixed_seed_(fixed_seed) {
6982
7083void Random::Reset () {
7184 if (fixed_seed_) {
72- rng_.seed (0 );
85+ rng_.seed (seed_ );
7386 }
7487}
7588
0 commit comments