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." );