diff --git a/alib2algo/src/automaton/generate/RandomizeAutomaton.h b/alib2algo/src/automaton/generate/RandomizeAutomaton.h index bfb15b7a816d45c1a4765b927dd52a3f423f6422..d2274c1fc8f0165454f20d2f36f4b2ac349bb361 100644 --- a/alib2algo/src/automaton/generate/RandomizeAutomaton.h +++ b/alib2algo/src/automaton/generate/RandomizeAutomaton.h @@ -29,7 +29,7 @@ class RandomizeAutomaton : public std::SingleDispatch < RandomizeAutomaton, auto static std::map < T, T > permutationMap ( const std::set < T > & data ) { std::vector < T > dataVector ( data.begin ( ), data.end ( ) ); - std::random_shuffle ( dataVector.begin ( ), dataVector.end ( ) ); + std::shuffle ( dataVector.begin ( ), dataVector.end ( ), std::random_devices::semirandom ); std::map < T, T > permutation; for ( const std::tuple < const T &, const T & > & fromToPair : std::make_tuple_foreach ( data, dataVector ) ) { permutation.insert ( std::make_pair ( std::get < 0 > ( fromToPair ), std::get < 1 > ( fromToPair ) ) ); diff --git a/alib2std/src/extensions/random.hpp b/alib2std/src/extensions/random.hpp index a961a927b3114da0aaa1f3993edef2d5489e6713..76ba624729c6355cdbf09533a8338877079e17f3 100644 --- a/alib2std/src/extensions/random.hpp +++ b/alib2std/src/extensions/random.hpp @@ -38,6 +38,10 @@ private: result_type max() { return numeric_limits<result_type>::max() ; } + + void seed ( unsigned int seed ) { + gen.seed ( seed ); + } }; public: static semirandom_device semirandom; diff --git a/alib2std/test-src/extensions/RandomTest.cpp b/alib2std/test-src/extensions/RandomTest.cpp index 6564a93552ea677abf7ed31f8c370051fbfcc411..1f21f11262d6550258aebb503ea780382f6ef178 100644 --- a/alib2std/test-src/extensions/RandomTest.cpp +++ b/alib2std/test-src/extensions/RandomTest.cpp @@ -13,5 +13,12 @@ void RandomTest::tearDown() { void RandomTest::testRandom() { std::cout << std::random_devices::random() << std::endl; std::cout << std::random_devices::semirandom() << std::endl; + + std::random_devices::semirandom.seed ( 100 ); + unsigned first = std::random_devices::semirandom(); + std::random_devices::semirandom.seed ( 100 ); + unsigned second = std::random_devices::semirandom(); + + CPPUNIT_ASSERT( first == second ); } diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp index bfad0782fe26248aee753b5747aaabd3269e3f20..eef364eb3908d4000a8919cb07b66d6f9754bfcb 100644 --- a/arand2/src/arand.cpp +++ b/arand2/src/arand.cpp @@ -8,6 +8,7 @@ #include <tclap/CmdLine.h> #include <global/GlobalData.h> #include <measure> +#include <random> #include <sax/FromXMLParserHelper.h> #include <string/String.h> @@ -43,6 +44,9 @@ int main ( int argc, char * argv[] ) { TCLAP::ValueArg < std::string > type ( "t", "type", "Type of generated structure", true, "FSM", & allowedVals ); cmd.add ( type ); + + TCLAP::ValueArg < unsigned > seed ( "s", "seed", "Seed random number", false, 0, "integer" ); + cmd.add ( seed ); TCLAP::ValueArg < int > alphabetSize ( "", "terminals", "Number of terminals/alphabet size", false, 3, "integer" ); cmd.add ( alphabetSize ); @@ -97,6 +101,9 @@ int main ( int argc, char * argv[] ) { if ( measure.isSet ( ) ) common::GlobalData::measure = true; + if ( seed.isSet ( ) ) + std::random_devices::semirandom.seed ( seed.getValue ( ) ); + measurements::start ( "Overal", measurements::Type::OVERALL ); if ( !type.isSet ( ) ) throw exception::CommonException ( "Type is not defined." );