mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Replaced use of std::rand with std::mt19937
This uses a global instance of the RNG
This commit is contained in:
		| @@ -9,23 +9,21 @@ | ||||
| #include "catch_context.h" | ||||
| #include "catch_interfaces_config.h" | ||||
|  | ||||
| #include <cstdlib> | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     void seedRng( IConfig const& config ) { | ||||
|         if( config.rngSeed() != 0 ) | ||||
|             std::srand( config.rngSeed() ); | ||||
|     std::mt19937& rng() { | ||||
|         static std::mt19937 s_rng; | ||||
|         return s_rng; | ||||
|     } | ||||
|  | ||||
|     void seedRng( IConfig const& config ) { | ||||
|         if( config.rngSeed() != 0 ) { | ||||
|             std::srand( config.rngSeed() ); | ||||
|             rng().seed( config.rngSeed() ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     unsigned int rngSeed() { | ||||
|         return getCurrentContext().getConfig()->rngSeed(); | ||||
|     } | ||||
|  | ||||
|     RandomNumberGenerator::result_type RandomNumberGenerator::operator()( result_type n ) const { | ||||
|         return std::rand() % n; | ||||
|     } | ||||
|     RandomNumberGenerator::result_type RandomNumberGenerator::operator()() const { | ||||
|         return std::rand() % (max)(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -8,31 +8,16 @@ | ||||
| #define TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED | ||||
|  | ||||
| #include <algorithm> | ||||
| #include <random> | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     struct IConfig; | ||||
|  | ||||
|     std::mt19937& rng(); | ||||
|     void seedRng( IConfig const& config ); | ||||
|  | ||||
|     unsigned int rngSeed(); | ||||
|  | ||||
|     struct RandomNumberGenerator { | ||||
|         using result_type = unsigned int; | ||||
|  | ||||
|         static constexpr result_type (min)() { return 0; } | ||||
|         static constexpr result_type (max)() { return 1000000; } | ||||
|  | ||||
|         result_type operator()( result_type n ) const; | ||||
|         result_type operator()() const; | ||||
|  | ||||
|         template<typename V> | ||||
|         static void shuffle( V& vector ) { | ||||
|             RandomNumberGenerator rng; | ||||
|             std::shuffle( vector.begin(), vector.end(), rng ); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED | ||||
|   | ||||
| @@ -28,7 +28,7 @@ namespace Catch { | ||||
|                 break; | ||||
|             case RunTests::InRandomOrder: | ||||
|                 seedRng( config ); | ||||
|                 RandomNumberGenerator::shuffle( sorted ); | ||||
|                 std::shuffle( sorted.begin(), sorted.end(), rng() ); | ||||
|                 break; | ||||
|             case RunTests::InDeclarationOrder: | ||||
|                 // already in declaration order | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash