Testrandom

Performance test of all the ROOT random generator (TRandom, TRandom1, TRandom2 and TRandom3) Tests the generator TRandom3 against some ref values and creates a timing table against TRandom, TRandom1 and TRandom2.

E.g. on an an Intel Xeon Quad-core Harpertown (E5410) 2.33 GHz running Linux SLC4 64 bit and compiled with gcc 3.4

Distribution        nanoseconds/call
                    TRandom  TRandom1 TRandom2 TRandom3
Rndm..............    5.000  105.000    7.000   10.000
RndmArray.........    4.000  104.000    6.000    9.000
Gaus..............   36.000  180.000   40.000   48.000
Rannor............  118.000  220.000  120.000  124.000
Landau............   22.000  123.000   26.000   31.000
Exponential.......   93.000  198.000   98.000  104.000
Binomial(5,0.5)...   30.000  548.000   46.000   65.000
Binomial(15,0.5)..   75.000 1615.000  125.000  178.000
Poisson(3)........   96.000  494.000  109.000  125.000
Poisson(10).......  138.000 1236.000  165.000  203.000
Poisson(70).......  818.000 1195.000  835.000  844.000
Poisson(100)......  837.000 1218.000  849.000  864.000
GausTF1...........   83.000  180.000   87.000   88.000
LandauTF1.........   80.000  180.000   83.000   86.000
GausUNURAN........   40.000  139.000   41.000   44.000
PoissonUNURAN(10).   85.000  271.000   92.000  102.000
PoissonUNURAN(100)   62.000  256.000   69.000   78.000

Note that this tutorial can be executed in interpreted or compiled mode

Root > .x testrandom.C
 Root > .x testrandom.C++

Author: Rene Brun, Lorenzo Moneta
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Sunday, August 09, 2020 at 08:19 AM.

In [1]:
%%cpp -d
#include <TRandom1.h>
#include <TRandom2.h>
#include <TRandom3.h>
#include <TRandomGen.h>
#include <TStopwatch.h>
#include <TF1.h>
#include <TUnuran.h>
#include <TUnuranContDist.h>
#include <TFile.h>

A helper function is created:

In [2]:
%%cpp -d
void testAll() {
  int i, N = 2000000;
  float cpn = 1000000000./N;
  int N1 = N/10; float cpn1 = cpn*10;  // for TRandom1
  double x,y;
  TRandom *rsave = gRandom;
  TRandom *r0 = new TRandom();
  TRandom *r1 = new TRandom1();
  TRandom *r2 = new TRandom2();
  TRandom *r3 = new TRandom3();
  TRandom *r4 = new TRandomMixMax();
  TRandom *r5 = new TRandomMixMax17();
  TRandom *r6 = new TRandomGen<ROOT::Math::MixMaxEngine<256,0>>();
  TRandom *r7 = new TRandomMixMax256();
  TRandom *r8 = new TRandomGen<ROOT::Math::MixMaxEngine<256,4>>();
  TRandom *r9 = new TRandomMT64();
  TRandom *r10 = new TRandomRanlux48();


  TStopwatch sw;
  printf("Distribution            nanoseconds/call\n");
  printf("                    TRandom  TRandom1 TRandom2 TRandom3 MixMax240 MixMax17 Mixmax256_0 MixMax256_2 MixMax256_4 MT_64 Ranlux48\n");

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Rndm(i);
  }
  printf("Rndm.............. %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  // new random generators

  sw.Start();
  for (i=0;i<N;i++) {
     x = r4->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r5->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r6->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r7->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r8->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r9->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r10->Rndm(i);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);

  printf("\n\n");

  // RNDMARRAY
  
  const int NR = 1000;
  double rn[NR];
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r0->RndmArray(NR,rn);
  }
  printf("RndmArray......... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i+=NR) {
     r1->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r2->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r3->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
   sw.Start();
  for (i=0;i<N;i+=NR) {
     r4->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r5->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r6->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r7->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r8->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=NR) {
     r9->RndmArray(NR,rn);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i+=NR) {
     r10->RndmArray(NR,rn);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn1);

  // Gaus

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Gaus(0,1);
  }
  printf("Gaus.............. %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r4->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r5->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r6->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r7->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r8->Gaus(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r9->Gaus(0,1);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);


  // RANNOR
  
  sw.Start();
  for (i=0;i<N;i+=2) {
     r0->Rannor(x,y);
  }
  printf("Rannor............ %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i+=2) {
     r1->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r2->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r3->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r4->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r5->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r6->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r7->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r8->Rannor(x,y);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i+=2) {
     r9->Rannor(x,y);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);
  
  // Landau
  
  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Landau(0,1);
  }
  printf("Landau............ %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Landau(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Landau(0,1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Landau(0,1);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Exp(1);
  }
  printf("Exponential....... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Exp(1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Exp(1);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Exp(1);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Binomial(5,0.5);
  }
  printf("Binomial(5,0.5)... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Binomial(5,0.5);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Binomial(5,0.5);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Binomial(5,0.5);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Binomial(15,0.5);
  }
  printf("Binomial(15,0.5).. %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Binomial(15,0.5);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Binomial(15,0.5);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Binomial(15,0.5);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Poisson(3);
  }
  printf("Poisson(3)........ %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Poisson(3);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Poisson(3);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Poisson(3);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Poisson(10);
  }
  printf("Poisson(10)....... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Poisson(10);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Poisson(10);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Poisson(10);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Poisson(70);
  }
  printf("Poisson(70)....... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Poisson(70);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Poisson(70);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Poisson(70);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  sw.Start();
  for (i=0;i<N;i++) {
     x = r0->Poisson(100);
  }
  printf("Poisson(100)...... %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N1;i++) {
     x = r1->Poisson(100);
  }
  printf(" %8.3f",sw.CpuTime()*cpn1);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r2->Poisson(100);
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = r3->Poisson(100);
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  TF1 *f1 = new TF1("f1","gaus",-4,4);
  f1->SetParameters(1,0,1);
  gRandom = r0;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f1->GetRandom();
  }
  printf("GausTF1........... %8.3f",sw.CpuTime()*cpn);
  gRandom = r1;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f1->GetRandom();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  gRandom = r2;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f1->GetRandom();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  gRandom = r3;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f1->GetRandom();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  TF1 *f2 = new TF1("f2","landau",-5,15);
  f2->SetParameters(1,0,1);

  gRandom = r0;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f2->GetRandom();
  }
  printf("LandauTF1......... %8.3f",sw.CpuTime()*cpn);
  gRandom = r1;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f2->GetRandom();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  gRandom = r2;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f2->GetRandom();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  gRandom = r3;
  sw.Start();
  for (i=0;i<N;i++) {
     x = f2->GetRandom();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  // test using Unuran
  TUnuran unr0(r0);
  TUnuran unr1(r1);
  TUnuran unr2(r2);
  TUnuran unr3(r3);

  // continuous distribution (ex. Gaus)
  TUnuranContDist dist(f1);
  // use arou method (is probably the fastest)
  unr0.Init(dist,"arou");
  unr1.Init(dist,"arou");
  unr2.Init(dist,"arou");
  unr3.Init(dist,"arou");

  sw.Start();
  for (i=0;i<N;i++) {
     x = unr0.Sample();
  }
  printf("GausUNURAN........ %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr1.Sample();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr2.Sample();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr3.Sample();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  // Poisson (nned to initialize before with Poisson mu value)

  unr0.InitPoisson(10);
  unr1.InitPoisson(10);
  unr2.InitPoisson(10);
  unr3.InitPoisson(10);

  sw.Start();
  for (i=0;i<N;i++) {
     x = unr0.SampleDiscr();
  }
  printf("PoissonUNURAN(10). %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr1.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr2.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr3.SampleDiscr();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);

  unr0.InitPoisson(100);
  unr1.InitPoisson(100);
  unr2.InitPoisson(100);
  unr3.InitPoisson(100);

  sw.Start();
  for (i=0;i<N;i++) {
     x = unr0.SampleDiscr();
  }
  printf("PoissonUNURAN(100) %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr1.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr2.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr3.SampleDiscr();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);


  delete r0;
  delete r1;
  delete r2;
  delete r3;
  gRandom = rsave;

#ifdef LATER
  // Binomial
  unr0.InitBinomial(15,0.5);
  unr1.InitBinomial(15,0.5);
  unr2.InitBinomial(15,0.5);
  unr3.InitBinomial(15,0.5);

  sw.Start();
  for (i=0;i<N;i++) {
     x = unr0.SampleDiscr();
  }
  printf("BinomialUN(15,0.5) %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr1.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr2.SampleDiscr();
  }
  printf(" %8.3f",sw.CpuTime()*cpn);
  sw.Start();
  for (i=0;i<N;i++) {
     x = unr3.SampleDiscr();
  }
  printf(" %8.3f\n",sw.CpuTime()*cpn);
#endif

}

A helper function is created:

In [3]:
%%cpp -d
int testRandom3() {

  Float_t RefValue[] = // running using a seed of 4357 ROOT 5.13.07 and checked with GSL 1.8
     {  0.999741749, 0.162909875, 0.282617805, 0.947201082, 0.231656543, 0.484973614, 0.957476957, 0.744305343,
        0.540043658, 0.739952981, 0.759943798, 0.658636614, 0.315637622, 0.804403015, 0.519672115, 0.168572422,
        0.47552973, 0.392313994, 0.221667687, 0.213190459,0.0303352042,  0.33353925, 0.194148851, 0.943716781,
        0.579931675, 0.898304858, 0.665563931,  0.49861031, 0.560628257, 0.182284646, 0.296525531, 0.117408933,
        0.0629176658, 0.648125575, 0.725418529, 0.637131158, 0.713885062,0.0995762432, 0.699267196,  0.10781247,
        0.129242751, 0.502403039, 0.207779906, 0.288910306,0.0831747944, 0.128124215, 0.547371411,0.0823195996,
        0.292141427, 0.891623737, 0.227117839, 0.431845463, 0.140733001, 0.400392135, 0.686946901, 0.170670911,
        0.440820868, 0.045336565, 0.311296414, 0.506181051,  0.18241084, 0.511032015, 0.740788205, 0.365988627,
        0.160808837, 0.460106785, 0.627836472, 0.677603688, 0.698196523, 0.478536868,0.0901075942, 0.338728522,
        0.0952137967, 0.436541964, 0.474673352, 0.419245926, 0.777536852, 0.624610565,  0.98043655, 0.370430201,
        0.830812636, 0.140806447, 0.744085307,  0.82973968, 0.391104318, 0.621956392, 0.346699478,0.0461695245,
        0.613066321, 0.567374048, 0.498894026, 0.723802079, 0.144550525,0.0423031633, 0.310787023, 0.121641154,
        0.242069671, 0.381058855, 0.440128537, 0.599795902, 0.644574654, 0.432626217, 0.555968262, 0.716841168,
        0.642362515, 0.685776725,0.0961581462, 0.122933464,0.0569974151, 0.820072044, 0.125539286, 0.315745071,
        0.180566925, 0.142227219, 0.664429613, 0.685189223, 0.191001933, 0.436343019, 0.964459225,  0.86816359,
        0.130879965,  0.48444228, 0.374654451, 0.900475122, 0.178656787, 0.679635131,  0.62287431,  0.98365595,
        0.44071478, 0.804737277, 0.994845061, 0.541550961, 0.255905455, 0.638945635,  0.57591027,  0.25872142,
        0.191593001, 0.445663047, 0.149266509, 0.996723689, 0.121762222,  0.65153928,0.0277950978, 0.389977602,
        0.827913044, 0.283813907, 0.610203644,  0.23641275,  0.41082105, 0.677714617, 0.847126588, 0.649256228,
        0.0813826511, 0.120830484, 0.479199264, 0.777878358, 0.471977701, 0.943337511, 0.980800992, 0.334554731,
        0.202667924, 0.342841234, 0.653544244, 0.682758797,  0.60993614,0.0999271029, 0.766254981, 0.735581528,
        0.24113914, 0.263178711, 0.960869899, 0.423395737, 0.336058146,0.000249497825, 0.868841017,0.00375315035,
        0.165846311,0.0118208411, 0.606455074, 0.729972019, 0.613824557, 0.965768184, 0.497098261, 0.529885403,
        0.461607532, 0.713033701, 0.579959768, 0.682802555, 0.953921514,0.0236552036, 0.280110147, 0.869526353,
        0.299333274, 0.319553603, 0.300951709, 0.941111486, 0.848127064, 0.753346129, 0.538244087, 0.408481381,
        0.212371316,0.0761404021, 0.289934908,0.0197818337, 0.241247899, 0.384619165, 0.454906886, 0.373982521,
        0.440188796, 0.117896808, 0.805429845, 0.164892641, 0.282529936, 0.172685399,  0.93584233,  0.68095306,
        0.133696739, 0.254761223, 0.399444876, 0.369235365, 0.726361892, 0.277837459, 0.693569104, 0.500354689,
        0.118405538, 0.151303335, 0.681446943, 0.720665918, 0.979646939, 0.696779111, 0.557210072, 0.680821482,
        0.95535205, 0.598208956, 0.770453895, 0.913597486, 0.658958649, 0.670974613, 0.578185175,  0.95303929,
        0.162923458, 0.335056986, 0.951824704, 0.109661644, 0.619302303, 0.956816742, 0.985243094,0.0707377489,
        0.50233039, 0.680721226, 0.553320066, 0.587005581, 0.691620562,  0.46264791, 0.574254294, 0.072890088,
        0.638266518, 0.387757288, 0.220960217,0.00223180233, 0.495656775, 0.191316523, 0.022265008, 0.903589021,
        0.738628175,  0.44453089, 0.417702243, 0.760861122, 0.437753222, 0.190982861, 0.577112962, 0.132688343,
        0.317824347,  0.48691649, 0.939091069, 0.933946281, 0.073660135, 0.612436295, 0.514748724, 0.624663582,
        0.130645262, 0.645210441,  0.13414855, 0.652925968, 0.265210009, 0.381805269,  0.59021506, 0.669704082,
        0.55433248,0.0195047602, 0.184346962, 0.991180462, 0.573677764, 0.637762085, 0.594857598, 0.515244688,
        0.330693509,  0.39674245,  0.88396548, 0.771485266, 0.599075381,0.0247266297,0.0122587895, 0.698452319,
        0.265991009, 0.736700721, 0.999972619, 0.749792316, 0.484955589, 0.823700529,  0.62277709, 0.902512094,
        0.0565051287, 0.739077389,  0.37617622, 0.036800765, 0.776198219, 0.837354186,  0.34508193,0.0818426476,
        0.222621545, 0.152476319, 0.401177195, 0.531612608, 0.811706602,0.0407775661, 0.117889008, 0.575189965,
        0.832362208, 0.204641853, 0.238721773,   0.9969287, 0.258590596, 0.892055968, 0.846859788, 0.306583706,
        0.0333624918, 0.706420498, 0.193615608, 0.508978138,0.0215451468, 0.672732793, 0.813562444, 0.807284052,
        0.481526843, 0.537519095, 0.780848606, 0.335848908, 0.699259371, 0.425855299, 0.825240663, 0.945613692,
        0.55484125, 0.710495188, 0.378360366, 0.648338731,0.0456727168, 0.155477323, 0.885353968, 0.721565725,
        0.961667201, 0.430300885, 0.132031354, 0.439331209, 0.467187736, 0.410083217, 0.277196711, 0.278509559,
        0.954620806, 0.804357491, 0.968510466, 0.999722791, 0.947160283, 0.248551138,0.0067049861, 0.444727315,
        0.674048778, 0.496480361,0.0210092501, 0.831763222, 0.108545852,0.0931516394,  0.89020564, 0.445945211,
        0.906906768, 0.554039821, 0.759434349, 0.815551384, 0.532968503,0.0551351462,0.0539856541,  0.89918819,
        0.146907374, 0.482647314,0.0673029809, 0.281161865, 0.932849165, 0.507317933, 0.564503014,   0.8007132,
        0.645887499, 0.309219498,0.0478066066,  0.25196583, 0.713881142, 0.670994017,  0.60528576, 0.148271899,
        0.79525035, 0.665277353, 0.854302043, 0.810533677,0.0711439839,0.0687935678, 0.890466573, 0.758045957,
        0.0703105873, 0.852094478, 0.775356902, 0.684895203, 0.234552787, 0.461575694, 0.936435457, 0.664946419,
        0.45967959,  0.88782351, 0.574622261,0.0301686234, 0.767354721, 0.345478555, 0.609123143,  0.21754287,
        0.643760561, 0.571392649, 0.802311049, 0.962335547, 0.401769856, 0.996553418, 0.745945812, 0.448411183,
        0.39578428, 0.123389926, 0.532614913, 0.833379602,  0.91767313, 0.825607567,   0.4459154, 0.267136201,
        0.6643989, 0.766860694, 0.665968275, 0.503955105, 0.835153702, 0.622405379, 0.457538918, 0.554983278,
        0.36581371, 0.656302231, 0.917038669, 0.276054591, 0.121214441, 0.966178254, 0.697439008, 0.443547789,
        0.630195824, 0.368346675, 0.238191956, 0.300273821, 0.710332172,0.0474748381, 0.492525443,0.0812539798,
        0.122016782,  0.99310218, 0.355091027, 0.764863731, 0.904099543, 0.396109613, 0.817134856, 0.348974222,
        0.266193634, 0.367501958, 0.752316213, 0.587800024, 0.489421095, 0.673474061, 0.328296139, 0.853945839,
        0.832380736, 0.159588686, 0.322411022, 0.950173707, 0.095376712, 0.231019855, 0.860607752, 0.359627192,
        0.984843699,0.0319756679, 0.828649914,  0.51680949, 0.489407924, 0.963977298, 0.960131739, 0.681816791,
        0.860788169, 0.455829282, 0.332390656,0.0591498043, 0.452245977, 0.217354216,  0.34560744, 0.549971993,
        0.317622252, 0.892976443,  0.49004545,  0.25647901, 0.968998638, 0.910636465, 0.226717598, 0.327828572,
        0.28670209, 0.142515054,0.0992817392, 0.192332409, 0.308376869, 0.871415959, 0.391148786, 0.788660882,
        0.200816041, 0.986475959, 0.882862126, 0.109862451, 0.354283255, 0.555742682, 0.690698458, 0.643815752,
        0.363104285,0.0788627111, 0.200820414,  0.71697353, 0.744353746,  0.76763643, 0.245442451, 0.668009119,
        0.886989377, 0.366849931, 0.531556628, 0.502843979,  0.31454367, 0.622541364,0.0199038582, 0.676355134,
        0.429818622, 0.232835212, 0.987619457, 0.306572135, 0.494637038, 0.748614893, 0.891843561,0.0452854959,
        0.427561072, 0.226978442, 0.484072985,  0.16464563,0.0898074883, 0.384263737,0.0238354723, 0.329734547,
        0.531230736, 0.476683361, 0.877482474, 0.455501628, 0.497302495, 0.396184301, 0.886124728, 0.736070092,
        0.108917595, 0.397921902, 0.842575021,  0.82620032, 0.936655165,  0.24558961, 0.639688616, 0.493335031,
        0.0734495069, 0.780138101,0.0421121232, 0.701116477, 0.940523267,  0.70054817, 0.776760272, 0.192742581,
        0.0069252688, 0.842983626, 0.919324176, 0.242083269, 0.190100674, 0.735084639, 0.164522319,  0.99030645,
        0.98284794, 0.657169539,0.0187736442, 0.759596482, 0.357567611, 0.509016344, 0.738899681, 0.567923164,
        0.289056634,  0.41501714, 0.981054561, 0.365884479, 0.517878261, 0.844209022, 0.968122653, 0.258894528,
        0.478310441, 0.437340986, 0.379398001, 0.203081884, 0.550820748, 0.255542723, 0.550098031, 0.870477939,
        0.241230214, 0.157108238, 0.218260827, 0.116277737, 0.749018275, 0.158290659, 0.476353907, 0.545327323,
        0.878978121,0.0171442169, 0.542981987, 0.318018082, 0.788805343, 0.871721374, 0.738490409,0.0923330146,
        0.301398643, 0.637103286, 0.571564271, 0.712810342, 0.644289242, 0.230476008, 0.971695586, 0.966159428,
        0.291883909, 0.175285818, 0.312882552,  0.98465128, 0.568391354, 0.844468564, 0.144433908,  0.45994061,
        0.607897905, 0.184122705, 0.342805493, 0.606432998, 0.838196585, 0.186188518,0.0302744689, 0.307391858,
        0.125286029, 0.270394965, 0.874161481, 0.370509557,  0.89423337, 0.407995674, 0.881878469, 0.647951238,
        0.236986727, 0.528807336, 0.293731542,0.0943204253, 0.934538626, 0.121679332,  0.34968176,0.0670268578,
        0.642196769, 0.692447138, 0.334926733, 0.374244194, 0.313885051, 0.538738295, 0.098592523, 0.490514225,
        0.32873567, 0.709725794,  0.88169803, 0.393000481, 0.854243273, 0.463776593,  0.52705639, 0.493309892,
        0.267784336, 0.583077476,0.0573514167, 0.959336368, 0.771417173,0.0427184631, 0.498433369,0.0522942701,
        0.56155145, 0.960361909, 0.619817314, 0.528628368, 0.698235179, 0.186162042, 0.553998168, 0.666120292,
        0.152731049, 0.948750157, 0.186825789, 0.580512664, 0.851024442, 0.106865844, 0.675861737,  0.79604524,
        0.657646103,0.00934952381, 0.206267588, 0.636420368,0.0382564603,  0.67771025, 0.677917925, 0.671684269,
        0.396317716, 0.661597047, 0.633360383, 0.962124239, 0.992711418,0.0993448263,0.0678932741, 0.426013152,
        0.947045502, 0.708326009, 0.466817846,0.0448362886, 0.748580922, 0.678370694, 0.210921343, 0.398490306,
        0.953675585,0.0289022848, 0.935766569, 0.846930474, 0.662760176, 0.867910903, 0.652359324,  0.45280494,
        0.305228982, 0.352034987, 0.279643402, 0.236045594,0.0270034608, 0.652062389, 0.712000227, 0.619930867,
        0.125439078, 0.452789963,  0.92233151, 0.120844359, 0.403808975, 0.260290446, 0.778843638,   0.6678412,
        0.0267894373, 0.491332301, 0.915060888, 0.704025347, 0.628200853, 0.578338467, 0.629156416, 0.730410649,
        0.641318334, 0.463709335, 0.614291239, 0.254470656, 0.808682692,  0.22898373, 0.450477996, 0.874235142,
        0.202773906, 0.523711192, 0.126518266, 0.579402899,  0.26188467, 0.207769057,  0.55283816, 0.851395364,
        0.513594437, 0.558259845, 0.666148535, 0.998974657, 0.178274074, 0.116739636,0.0684255431, 0.622713377,
        0.31448295, 0.889827933,  0.80647766, 0.429916949, 0.524695458,  0.45267553, 0.630743121, 0.566594485,
        0.958860663, 0.908052286, 0.700898262, 0.377025384, 0.683796226, 0.198088462, 0.617400699, 0.413726158,
        0.823588417, 0.755577948, 0.703097317, 0.364294278, 0.819786986, 0.751581763, 0.048769509, 0.528569003,
        0.616748192, 0.270942831, 0.800841747, 0.235174223, 0.903786552, 0.258801569, 0.191336412, 0.012410342,
        0.853413998, 0.621008712, 0.855861931, 0.140106201, 0.872687964, 0.708839735,0.0926409892,0.0207504195,
        0.782636518,0.0300825236, 0.504610632,0.0816221782, 0.773493745, 0.872577282, 0.880031248, 0.883524299,
        0.872427328, 0.458722225, 0.902298841, 0.547904952,0.0559884352, 0.591179888, 0.563941709, 0.776130076,
        0.295569778,0.0408536533, 0.398567183,  0.28227462, 0.806716321, 0.507159362, 0.688150965,  0.49466404,
        0.45454604, 0.421480091,0.0392517329,0.0911962031, 0.393815309, 0.135373195, 0.968650583, 0.811676111,
        0.325965411, 0.961999178, 0.100281202, 0.102924612,  0.30725909,  0.33368206, 0.857966134, 0.522921736,
        0.615500041, 0.981558684, 0.797484739, 0.198809674,  0.45670419, 0.570970797, 0.214908696, 0.686433314,
        0.278602115, 0.179739848, 0.397497946, 0.162858935, 0.802621762,0.0836459133, 0.638270752, 0.230856518,
        0.580094379, 0.864292514, 0.932738287, 0.821393124, 0.480590473, 0.636373016, 0.181508656, 0.469200501,
        0.309276441, 0.668810431, 0.722341161, 0.574856669, 0.527854513, 0.809231559, 0.986882661, 0.323860496,
        0.606396459, 0.759558966,  0.79096818,0.0699298142, 0.550465414,0.00929828244, 0.784629475, 0.689044114,
        0.963588091, 0.516441598, 0.357178305, 0.482336892, 0.429959602, 0.996306147, 0.601176011, 0.785004207,
        0.970542121, 0.487854549,0.0949267522, 0.979331773, 0.120877739, 0.630260336,  0.19424754, 0.213081703,
        0.0145987798, 0.366671115, 0.340100777, 0.721786347, 0.367533113,0.0210335371, 0.131687992, 0.586759676,
        0.73360464, 0.863635151, 0.136994646,0.0524269778, 0.406223408, 0.241656947, 0.472450703, 0.872215979,
        0.454719233,0.0715790696, 0.314061244, 0.492823114, 0.741721134, 0.694783663, 0.982867872, 0.319748137,
        0.804203704,0.0534678153, 0.746155348, 0.303474931,0.0930815139, 0.934531664, 0.746868186, 0.100048471,
        0.720296508,  0.21075374,  0.96309675, 0.749189411, 0.739621932, 0.510072327,0.0872929865, 0.650020469,
        0.0823648495, 0.726920745, 0.532618265, 0.749305866,  0.86126694,0.0346994482,0.0931224583, 0.655257095,
        0.959517847, 0.487057231, 0.859895745, 0.084794421, 0.718541715, 0.850918328, 0.818884782,  0.71627446,
        0.40822393,  0.63658567, 0.523838703, 0.372038872, 0.353426097, 0.598049047,0.0974868746, 0.276353038
     };

     Int_t rc1 = 0;
     Int_t rc2 = 0;
     TRandom3 r(4357);
     Float_t x;
     Int_t i;

     // check whether the sequence is ok or not
     for (i=0;i<1000;i++) {
       x = r.Rndm();
       // printf("%e ",x-RefValue[i]); if(i%8==7) printf("\n");
       if (TMath::Abs(x-RefValue[i]) > 10e-8) {
         printf("i=%d x=%.8f but should be %.8f\n",i,x,RefValue[i]);
         rc1 += 1;
       }
     }

     // check whether a state can be saved and restored
     TFile *file = new TFile("random3.root","RECREATE");
     file->SetCompressionLevel(0);
     r.Write("r");
     delete file;
     file = new TFile("random3.root");
     TRandom3 *rs = (TRandom3*) file->Get("r");
     for (i=0;i<1000;i++) {
       if (r.Rndm() - rs->Rndm() != 0) rc2 += 1;
     }
     if (rc2 != 0) printf("state restoration failed\n");

     return rc1 + rc2;
}
In [4]:
testRandom3();
testAll();
Distribution            nanoseconds/call
                    TRandom  TRandom1 TRandom2 TRandom3 MixMax240 MixMax17 Mixmax256_0 MixMax256_2 MixMax256_4 MT_64 Ranlux48
Rndm..............    5.000  100.000    5.000    5.000   10.000   15.000   10.000   25.000   35.000   20.000  200.000

RndmArray.........    5.000  100.000    5.000    5.000    5.000   10.000   10.000   20.000   30.000   20.000  200.000
Gaus..............   25.000  150.000   30.000   30.000   40.000   40.000   40.000   55.000   75.000   40.000
Rannor............   30.000  100.000   30.000   30.000   40.000   30.000   40.000   45.000   55.000   45.000
Landau............   15.000  100.000   20.000   20.000
Exponential.......   15.000  100.000   15.000   20.000
Binomial(5,0.5)...   20.000  450.000   30.000   30.000
Binomial(15,0.5)..   65.000 1250.000   85.000   80.000
Poisson(3)........   45.000  350.000   50.000   50.000
Poisson(10).......   75.000  950.000   85.000   90.000
Poisson(70).......  250.000  550.000  260.000  255.000
Poisson(100)......  250.000  600.000  255.000  255.000
GausTF1...........   55.000  130.000   55.000   55.000
LandauTF1.........   55.000  130.000   50.000   55.000
GausUNURAN........   15.000  105.000   20.000   25.000
PoissonUNURAN(10).   50.000  200.000   50.000   55.000
PoissonUNURAN(100)   50.000  200.000   45.000   50.000