mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-03 21:49:32 +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