This directory contains classes for using the UNU.RAN package in ROOT
BEGIN_HTML
UNU.RAN, (Universal Non Uniform Random number generator for generating non uniform pseudo-random numbers)
is an ANSI C library licensed under GPL.
It contains universal (also called automatic or black-box) algorithms that can generate random numbers from
large classes of continuous or discrete distributions, and also from practically all standard distributions.
An extensive online documentation are available at the UNU.RAN Web Site.
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 distribution from a set of data 1D // vdata is an std::vector containing the data TUnuranEmpDist dist( vdata.begin(),vdata.end()); unr.Init(dist); // sample N times (generate N random numbers) for (int i = 0; i < N; ++i) double x = unr.Sample();In the case of multi-dimension one needs to pass in addition to the iterators, the data dimension. It is assumed that the data are stored in the vector in this order : (x0,y0,...),(x1,y1,....).
// 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.
END_HTML