This directory contains classes for using the UNU.RAN package in ROOTUNU.RAN, (Universal Non Uniform Random number generator for generating non uniform pseudo-random numbers) is an ANSI C library licensed under GPL.
New classes have been introduced to use the UNU.RAN C library from ROOT and C++ from ROOT and using C++ objects. To use UNU.RAN one needs always an instance of the class TUnuran. It can then be used in two distinct ways:
TUnuran unr;
//initialize unuran to generate normal random numbers using a "arou" method
unr.Init("normal()","method=arou");
//......
// sample distributions N times (generate N random numbers)
for (int i = 0; i < N; ++i)
double x = unr.Sample();
//1D case: create a distribution from two TF1 object pointers pdfFunc
TUnuranContDist dist( pdfFunc);
//initialize unuran passing the distribution and a string defining the method
unr.Init(dist, "method=hinv");
// sample distribution N times (generate N random numbers)
for (int i = 0; i < N; ++i)
double x = unr.Sample();
//Multi-Dim case from a TF1 (or TF2 or TF3) object describing a multi-dimensional function
TUnuranMultiContDist dist( pdfFuncMulti);
// the recommended method for multi-dimensional function is "hitro"
unr.Init(dist, "method=hitro");
// sample distribution N times (generate N random numbers)
double x[NDIM];
for (int i = 0; i < N; ++i)
unr.SampleMulti(x);
// create distribution from a vector of probabilities
double pv[NSize] = {0.1,0.2,.......};
TUnuranDiscrDist dist(pv, pv+NSize);
// the recommended method for discrete distribution is
unr.Init(dist, "method=dgt");
// sample N times (generate N random numbers)
for (int i = 0; i < N; ++i)
int k = unr.SampleDiscr();
// create an empirical distribution from an histogram
// if the histogram has a buffer one must use TUnuranEmpDist(h1,false)
TH1 * h1 = ... // histogram pointer
TUnuranEmpDist binDist( h1);
unr.Init(binDist);
// sample N times (generate N random numbers)
for (int i = 0; i < N; ++i)
double x = unr.Sample();
This is equivalent to TH1::GetRandom(), but sampling is faster, therefore, since it requires some initialization time,
it becomes convenient when generating a large sample of random numbers.
Functionality is also provided via the C++ classes for using a different random number generator by passing a TRandom pointer when constructing the TUnuran class (by default the ROOT gRandom is passed to UNURAN).
The UNU.RAN documentation provides a detailed description of all the available methods and the possible options which one can pass to UNU.RAN for the various distributions.