Zadanie poprawkowe będzie polegało na przygotowaniu serii wartości pochodzących z generatora liczb losowych o wybranym rozkładzie, a następnie wykonaniu na tych danych określonych obliczeń. Wymagana będzie znajomość algorytmów oraz tworzenia wyrażeń lambda wykorzystywanych jako predykaty i funktory zamiast obiektów funkcyjnych.
Poniżej kod programu, którego znajomość może bardzo przydać się na zajęciach.
#include <iostream>
#include <iomanip>
#include <random>
#include <functional>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
int round( double fValue ) {
return fValue < 0 ? (int)ceil( fValue - 0.5 )
: (int)floor( fValue + 0.5 );
}
int main () {
// generator liczb losowych o rozkładzie równomiernym
// do zainicjalizowania losową wartością właściwego generatora
random_device rd;
// właściwy generator liczb losowych o rozkładzie równomiernym
// - Mersenne Twister, autorzy: Matsumoto and Nishimura, 1998
mt19937 engine(rd());
// funktor do generowania liczb losowych z rozkładu normalnego;
// konfiguracja rozkładu: średnia 0, sigma 3
normal_distribution<> normal(0.0, 3.0);
// funktor do prawidłowego wywołania potrzebuje generatora
// liczb losowych dlatego musi być wywoływany z argumentem
// reprezentującym właściwy generator - tak jak poniżej:
cout << "Test generatora: " << normal(engine) << "\n\n";
// tworzenie histogramu opisującego funkcję gęstości
// dla rozkładu normalnego - tzw. krzywa dzwonowa
map<int, int> hist1;
for(int n=0; n<100000; ++n)
++hist1[round(normal(engine))];
// funktor do generowania liczb całkowitych losowych
// z rozkładu równomiernego <0,9>;
uniform_int_distribution<int> uni(0, 9);
// tworzenie histogramu opisującego funkcję gęstości
// dla rozkładu równomiernego
map<int, int> hist2;
for(int n=0; n<100000; ++n)
++hist2[uni(engine)];
// wizualizacja krzywej dla rozkładu normalnego
// (grafika w oknie konsoli!)
// Uwaga: pętla 'for' oparta na zakresie jednak
// nie jest obsługiwana w VS2010, dlatego nie można
// tu napisać: "for (auto p1 : hist1) {". Przepraszam.
for_each(hist1.begin(), hist1.end(),
[](pair<int,int> p) {
cout << fixed << setprecision(1) << setw(2)
<< p.first << ' ' << string(p.second/200, '*') << '\n';});
// wizualizacja krzywej dla rozkładu równomiernego
// (grafika w oknie konsoli!)
for_each(hist2.begin(), hist2.end(),
[](pair<int,int> p) {
cout << fixed << setprecision(1) << setw(2)
<< p.first << ' ' << string(p.second/200, '*') << '\n';});
system("pause");
return 0;
}