From 10cf89043c3473781985e6c9f42f688a8e4bd54a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com> Date: Sat, 12 Mar 2016 09:37:08 +0100 Subject: [PATCH] changed RandomStringGenerator to allow bigger alphabets with integer symbols --- .../src/string/generate/RandomStringFactory.cpp | 14 ++++++++++++++ .../src/string/generate/RandomStringFactory.h | 1 + arand2/src/arand.cpp | 5 ++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/alib2algo/src/string/generate/RandomStringFactory.cpp b/alib2algo/src/string/generate/RandomStringFactory.cpp index b09850e974..91a6d35daa 100644 --- a/alib2algo/src/string/generate/RandomStringFactory.cpp +++ b/alib2algo/src/string/generate/RandomStringFactory.cpp @@ -17,6 +17,20 @@ namespace string { namespace generate { +string::LinearString RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) { + if ( !integerSymbols ) return generateLinearString ( size, alphabetSize, randomizedAlphabet ); + + if ( alphabetSize <= 0 ) + throw exception::AlibException ( "Alphabet size must be greater than 0." ); + + std::vector < alphabet::Symbol > elems; + + for ( size_t i = 0; i < size; i++ ) + elems.push_back ( alphabet::symbolFrom ( static_cast < int > ( std::random_devices::semirandom ( ) % alphabetSize ) ) ); + + return string::LinearString ( elems ); +} + string::LinearString RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) { if ( alphabetSize > 26 ) throw exception::AlibException ( "Too big alphabet." ); diff --git a/alib2algo/src/string/generate/RandomStringFactory.h b/alib2algo/src/string/generate/RandomStringFactory.h index 7b5e784efb..39f1a8e394 100644 --- a/alib2algo/src/string/generate/RandomStringFactory.h +++ b/alib2algo/src/string/generate/RandomStringFactory.h @@ -17,6 +17,7 @@ namespace generate { class RandomStringFactory { public: + static string::LinearString generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ); static string::LinearString generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ); static string::LinearString generateLinearString ( size_t size, std::set < alphabet::Symbol > alphabet ); }; diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp index 0d796fd892..19a66ba102 100644 --- a/arand2/src/arand.cpp +++ b/arand2/src/arand.cpp @@ -41,6 +41,9 @@ int main ( int argc, char * argv[] ) { TCLAP::ValueArg < int > alphabetSize ( "", "terminals", "Number of terminals/alphabet size", false, 3, "integer" ); cmd.add ( alphabetSize ); + TCLAP::SwitchArg integerSymbols ( "", "integerSymbols", "Use integer symbols instead of char symbols", false ); + cmd.add ( integerSymbols ); + TCLAP::SwitchArg randomizedAlphabet ( "", "randomizedTerminals", "Number of terminals/alphabet size", false ); cmd.add ( randomizedAlphabet ); @@ -127,7 +130,7 @@ int main ( int argc, char * argv[] ) { } else if ( type.getValue ( ) == "ST" ) { measurements::start ( "Algorithm", measurements::Type::MAIN ); - string::LinearString res = string::generate::RandomStringFactory::generateLinearString ( length.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ) ); + string::LinearString res = string::generate::RandomStringFactory::generateLinearString ( length.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ), integerSymbols.getValue ( ) ); measurements::end ( ); measurements::start ( "Output write", measurements::Type::AUXILIARY ); -- GitLab