diff --git a/docs/command-line.md b/docs/command-line.md index 14511db9..f8e80270 100644 --- a/docs/command-line.md +++ b/docs/command-line.md @@ -277,13 +277,20 @@ is that as long as the random seed is fixed, running only some tests ## Specify a seed for the Random Number Generator -
--rng-seed <'time'|number>+
--rng-seed <'time'|'random-device'|number>-Sets a seed for the random number generator using ```std::srand()```. -If a number is provided this is used directly as the seed so the random pattern is repeatable. -Alternatively if the keyword ```time``` is provided then the result of calling ```std::time(0)``` is used and so the pattern becomes unpredictable. In some cases, you might need to pass the keyword ```time``` in double quotes instead of single quotes. +Sets the seed for random number generators used by Catch2. These are used +e.g. to shuffle tests when user asks for tests to be in random order. + +Using `time` as the argument asks Catch2 generate the seed through call +to `std::time(nullptr)`. This provides very weak randomness and multiple +runs of the binary can generate the same seed if they are started close +to each other. + +Using `random-device` asks for `std::random_device` to be used instead. +If your implementation provides working `std::random_device`, it should +be preferred to using `time`. Catch2 uses `std::random_device` by default. -In either case the actual value for the seed is printed as part of Catch's output so if an issue is discovered that is sensitive to test ordering the ordering can be reproduced - even if it was originally seeded from ```std::time(0)```. ## Identify framework and version according to the libIdentify standard diff --git a/docs/release-notes.md b/docs/release-notes.md index 7e0f5a8f..56de2448 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -131,6 +131,7 @@ new design. * With the exception of the XmlReporter, the outputs of first party reporters should remain the same * New pair of events were added * One obsolete event was removed +* Catch2 generates a random seed if one hasn't been specified by the user ### Improvements @@ -161,6 +162,7 @@ new design. * `--list-*` flags write their output to file specified by the `-o` flag (#2061, #2163) * `Approx::operator()` is now properly `const` * Catch2's internal helper variables no longer use reserved identifiers (#578) +* `--rng-seed` now accepts string `"random-device"` to generate random seed using `std::random_device` ### Fixes diff --git a/src/catch2/catch_config.cpp b/src/catch2/catch_config.cpp index 20303c2a..b79059ec 100644 --- a/src/catch2/catch_config.cpp +++ b/src/catch2/catch_config.cpp @@ -72,7 +72,7 @@ namespace Catch { ShowDurations Config::showDurations() const { return m_data.showDurations; } double Config::minDuration() const { return m_data.minDuration; } TestRunOrder Config::runOrder() const { return m_data.runOrder; } - unsigned int Config::rngSeed() const { return *m_data.rngSeed; } + uint32_t Config::rngSeed() const { return m_data.rngSeed; } UseColour Config::useColour() const { return m_data.useColour; } bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } int Config::abortAfter() const { return m_data.abortAfter; } diff --git a/src/catch2/catch_config.hpp b/src/catch2/catch_config.hpp index 65a50ed8..7b67ba76 100644 --- a/src/catch2/catch_config.hpp +++ b/src/catch2/catch_config.hpp @@ -12,6 +12,7 @@ #include