RandGen nicht random



  • Hi,

    ich verwende folgendes um random numbers zu erzeugen. jedoch wird bei compilierung + neustart des programmes immer die gleiche random sequence erzeugt...warum und was kann man dagegen machen?

    #include <random>
    #include <iostream>
    
    class RandGen {
    private:
    	std::mt19937 eng;
    
    public:
    	RandGen(): eng{std::random_device{}()} {}
    
    	int random(const int min, const int max) {	
    		std::uniform_int_distribution<> dist{min,max};
    		return dist(eng);
    	}
    };
    
    int main() {
        RandGen r;
    
        for (int i=0; i<50; ++i) {
            std::cout << r.random(0, 100) << '\n';
        }
    }
    


  • Gib deinem Zufallsgenerator einen Seed mit, gewöhnlich nutzt man dazu die aktuelle Systemzeit in ms.

    Auf der anderen Seite wird dieser Effekt auch gerne mal für Reproduzierbarkeit genutzt, d.h. gleicher Seed, gleiche Zahlenfolge, was es eifnacher amcht Zufallszahlen zu speichern. Es reicht halt den Seed zu speichern und nicht alle zahlen.


  • Mod

    April fools!



  • gleiches ergebnis mit seed...warum!?

    class RandGenerator { 
    private: 
        std::mt19937 eng; 
    
    public: 
        RandGenerator(): eng{std::random_device{}()} {
    		const auto time_seed = static_cast<size_t>(std::time(0));
    		const auto clock_seed = static_cast<size_t>(std::clock());
    		const size_t pid_seed = std::hash<std::thread::id>()(std::this_thread::get_id());
    		std::seed_seq seed_value { time_seed, clock_seed, pid_seed };
    		gen.seed(seed_value);		
    	}
    
        int generate(const int min, const int max) {  
            std::uniform_int_distribution<> dist{min,max}; 
            return dist(eng); 
        }
    };
    


  • so funktioniert es:

    class RandGenerator { 
    private: 
        std::mt19937 eng; 
    
    public: 
        RandGenerator(): eng{std::random_device{}()} {
    		auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    		eng.seed(seed);		
    	}
    
        int generate(const int min, const int max) {  
            std::uniform_int_distribution<> dist{min,max}; 
            return dist(eng); 
        }
    };
    

Log in to reply