uniform_int_distribution zawsze zwraca max
Ostatnio zmodyfikowano 2020-03-14 16:00
zerotwarzygreya Temat założony przez niniejszego użytkownika |
uniform_int_distribution zawsze zwraca max » 2020-03-12 11:07:38 Cześć, moglibyście mi wytłumaczyć czemu funkcja random zawsze zwraca największą wartość z zakresu (operuje na małych zakresach od 1 do maksymalnie 3)? #include <iostream> #include <fstream> #include <map> #include <string> #include <random> #include <sstream>
using namespace std;
void create_map( ifstream & file, multimap < string, string >& m ) { string line; string word; while( getline( file, line ) ) { istringstream s( line ); s >> word; m.insert( make_pair( word, line.substr( word.size() + 1 ) ) ); } }
size_t random( default_random_engine & x, size_t num ) { uniform_int_distribution < unsigned > z( 1, num ); return z( x ); }
int main() { ifstream rules( "Text.txt" ); ifstream work( "Work.txt" ); multimap < string, string > w_trans; create_map( rules, w_trans ); string calls; default_random_engine x; while( getline( work, calls ) ) { string word; istringstream s( calls ); while( s >> word ) { auto it = w_trans.find( word ); if( it == w_trans.end() ) { cout << word << " "; continue; } for( size_t i = random( x, w_trans.count( word ) ); i != 1; --i, ++it ); cout << it->second << " "; } cout << endl; } }
|
|
TemplateEntity |
» 2020-03-12 17:34:35 Użyj biblioteki chrono i ustaw odpowiednie ziarno rozkładu. #include <chrono> .... .... x.seed( std::chrono::system_clock::now().time_since_epoch().count() ); .... ....
|
|
zerotwarzygreya Temat założony przez niniejszego użytkownika |
» 2020-03-12 18:06:31 Czyli jak chce generować randomowe liczby to przy każdej iteracji muszę ustawić seeda? Ponoć wybranie odpowiedniej liczby do seeda jest dość trudne macie dla mnie jakieś porady jak to robić. @up Dzięki za kod teraz program generuje randomowe wyniki. |
|
pekfos |
» 2020-03-14 16:00:34 Czyli jak chce generować randomowe liczby to przy każdej iteracji muszę ustawić seeda? Ponoć wybranie odpowiedniej liczby do seeda jest dość trudne macie dla mnie jakieś porady jak to robić. |
Wszystkie generatory pseudolosowe wymagają inicjaliacji. Dla tego samego ziarna będziesz dostawać te same sekwencje liczb, więc najprawdopodobniej powinieneś to robić dokładnie raz, a nie w pętli. Co do samej wartości, wszystko zależy czego potrzebujesz. Jedynym uniwersalnym rozwiązaniem jest użycie sprzętowego generatora (jeśli jest dostępny) do wylosowania ziarna. Wszystkie inne sposoby trzeba dostosować do potrzeb, zwykle wystarczy aktualny czas, jak podano powyżej. Pamiętaj jednak że w ten sposób ryzykujesz to samo ziarno w wielu generatorach w obrębie tego samego programu, lub w tym samym generatorze w obrębie wielu niezależnych procesów. |
|
« 1 » |