Hint: materiały pomocnicze przez ćwiczeniami 7 (poprawa zera)

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;
}