fornisce il metodo UniformDist() grazie all'overload di ()
Ma pensavo: che senso ha creare una classe che ha come membro significativo una sola funzione di cui appunto poi devo fare l'overload () per richiamarla.
Attenzione che UniformDist() è il costruttore (più o meno parametrico), non un metodo. Io non faccio altro che istanziare la classe e passarne la copia a std::generate(). L'overload di operator() serve perché è richiesto dall'algoritmo usato da std::generate().
http://en.cppreference.com/w/cpp/algorithm/generate
Altri algoritmi hanno operator() diverso.
http://en.cppreference.com/w/cpp/algorithm
ho pensato che i function object abbiano tutt'altro scopo o no?
No. Lo scopo di un function object è di poter trattare un oggetto come una funzione.
Cioè in questo caso io farei direttamente una funzione template, perchè fare questo casino per un solo metodo?
Nulla ti vieta di farlo, ma le variabili _a e _b devi passarle come parametri del template. Ricorda che la funzione non deve accettare parametri (nemmeno template) per essere usata con std::generate(). Se preferisci utilizzare un ciclo allora puoi utilizzare una funzione normale senza scomodare i template.
In altre parole, gli algoritmi usati da STL richiedono determinate cose e se vuoi usarli devi implementare queste cose come vogliono loro. Ne più ne meno di qualsiasi altra funzione di libreria.

Inoltre ti chiedo la seguente: non riesco bene ad inquadrare la differenza fra avere un functor e utilizzare un metodo di una classe. Il functor di fatto viene richiamato dopo che la classe viene istanziata giusto? Quindi diciamo che ho la class F e istanzio f, dopodichè da qualche parte utilizzerò f().
Esatto.
Ma non è equivalente a avere class C che ha un metodo f e da qualche parte utlizzare C.f() ?
Se una funzione richiede C() quella gli devi dare. Chiariamoci: io ho usato operator() per rendere compatibile la classe UniformDist con l'algoritmo std::generate(), ma non c'è scritto da nessuna parte che debba essere l'unica soluzione: è solo una soluzione.
Credo di aver capito qualcosa riguardo al cambiare o meno stato alla classe, ma ho davvero difficoltà a capire cosa significhi
Guarda che operator() è una funzione membro come lo è C::f(), per cui ha accesso a tutte le variabili membro di C esattamente come C::f(). Non capisco cosa non ti sia chiaro.