// Uppgift: Slumpar ut N heltal i ett intervall [A, B] och N flyttal normalfördelade runt M med standardavvikelse D och skriver ut en "bild" av fördelningen. // Nyckelord: slumgenerering, slumpfördelning, kommandoradsargument, std::map, std::vector, std::max_element, std::stoi, lambda-funktioner #include #include #include #include #include #include using namespace std; void read_arguments(int argc, char* argv[], int& a, int& b, int& m, int& d, int& n); int main(int argc, char* argv[]) { int A, B, MEAN, DEV, N; read_arguments(argc, argv, A, B, MEAN, DEV, N); // Choose random number generator: // mt19937 rnd(int(time(nullptr))); // default_random_engine rnd(int(time(nullptr))); // pseudo-random numbers random_device rnd; // uses true random device if possible cout << "Random entropy: " << rnd.entropy() << endl; // prints 0 if pseudo-random, >0 if better quality randomness uniform_int_distribution uniform(A, B); normal_distribution normal(MEAN, DEV); vector uniform_stat(B-A+1, 0); map normal_stat; for (int i = 0; i < N; ++i) { ++uniform_stat.at( uniform(rnd) - A ); // For students to think of: You will notice a peak at 0. Zero // will occur twice the times it should. Why? How do you fix it? ++normal_stat[ normal(rnd) ]; } auto uniform_max = max_element(uniform_stat.begin(), uniform_stat.end(), [](int a, int b)->bool { return a < b; }); cout << left << endl; cout << "---- Uniform distribution: " << endl; for (int i = A; i <= B; ++i) { cout << setw(3) << i << ":" << setfill('#') << setw( uniform_stat[i-A]*75/(*uniform_max) ) << uniform_stat[i-A] << setfill(' ') << endl; } auto normal_max = max_element(normal_stat.begin(), normal_stat.end(), [](std::pair const& a, std::pair const& b)->bool { return a.second < b.second; }); cout << endl; cout << "---- Normal distribution: " << endl; for (auto i : normal_stat) { cout << setw(3) << i.first << ":" << setfill('#') << setw( i.second*75/(*normal_max).second ) << i.second << setfill(' ') << endl; } return 0; } void read_arguments(int argc, char* argv[], int& a, int& b, int& m, int& d, int& n) { // default values a = 1; b = 10; m = 3; d = 5; n = 100000; for (int i = 1; i < argc-1; ++i) { if ( string(argv[i]) == "-n" ) n = stoi(argv[i+1]); if ( string(argv[i]) == "-m" ) m = stoi(argv[i+1]); if ( string(argv[i]) == "-d" ) d = stoi(argv[i+1]); if ( string(argv[i]) == "-a" ) a = stoi(argv[i+1]); if ( string(argv[i]) == "-b" ) b = stoi(argv[i+1]); } if ( a > b ) swap(a, b); }