ROOT logo

From $ROOTSYS/tutorials/math/quasirandom.C

//+______________________________________________________________________________
// Example of generating quasi-random numbers



#include "Math/QuasiRandom.h"
#include "Math/Random.h"
#include "TH2.h"
#include "TCanvas.h"
#include "TStopwatch.h"

#include <iostream>

using namespace ROOT::Math;

int quasirandom(int n = 10000, int skip = 0) { 


   TH2D * h0 = new TH2D("h0","Pseudo-random Sequence",200,0,1,200,0,1);
   TH2D * h1 = new TH2D("h1","Sobol Sequence",200,0,1,200,0,1);
   TH2D * h2 = new TH2D("h2","Niederrer Sequence",200,0,1,200,0,1);

   RandomMT         r0; 
   // quasi random numbers need to be created giving the dimension of the sequence
   // in this case we generate 2-d sequence

   QuasiRandomSobol r1(2); 
   QuasiRandomNiederreiter r2(2); 
   

   // generate n random points

   double x[2];
   TStopwatch w; w.Start();
   for (int i = 0; i < n; ++i)  { 
      r0.RndmArray(2,x);
      h0->Fill(x[0],x[1]);      
   }
   std::cout << "Time for gRandom ";
   w.Print();

   w.Start();
   if( skip>0) r1.Skip(skip);
   for (int i = 0; i < n; ++i)  { 
      r1.Next(x); 
      h1->Fill(x[0],x[1]);      
   }
   std::cout << "Time for Sobol ";
   w.Print();


   w.Start();
   if( skip>0) r2.Skip(skip);
   for (int i = 0; i < n; ++i)  {
      r2.Next(x); 
      h2->Fill(x[0],x[1]);      
   }
   std::cout << "Time for Niederreiter ";
   w.Print();


   TCanvas * c1 = new TCanvas("c1","Random sequence",600,1200); 
   c1->Divide(1,3);

   c1->cd(1);

   h0->Draw("COLZ");
   
   c1->cd(2);


   // check uniformity 
   h1->Draw("COLZ");

   c1->cd(3);

   h2->Draw("COLZ");

   gPad->Update();


   // test number of empty bins

   int nzerobins0 = 0;
   int nzerobins1 = 0;
   int nzerobins2 = 0;
   for (int i = 1; i <= h1->GetNbinsX(); ++i) { 
      for (int j = 1; j <= h1->GetNbinsY(); ++j) { 
         if (h0->GetBinContent(i,j) == 0 ) nzerobins0++;
         if (h1->GetBinContent(i,j) == 0 ) nzerobins1++;
         if (h2->GetBinContent(i,j) == 0 ) nzerobins2++;
      }
   }

   std::cout << "number of empty bins for pseudo-random = " << nzerobins0 << std::endl;
   std::cout << "number of empty bins for " << r1.Name() << "\t= " << nzerobins1 << std::endl;
   std::cout << "number of empty bins for " << r2.Name() << "\t= " << nzerobins2 << std::endl;

   int iret = 0; 
   if (nzerobins1 >= nzerobins0 ) iret += 1; 
   if (nzerobins2 >= nzerobins0 ) iret += 2; 
   return iret; 

}





 quasirandom.C:1
 quasirandom.C:2
 quasirandom.C:3
 quasirandom.C:4
 quasirandom.C:5
 quasirandom.C:6
 quasirandom.C:7
 quasirandom.C:8
 quasirandom.C:9
 quasirandom.C:10
 quasirandom.C:11
 quasirandom.C:12
 quasirandom.C:13
 quasirandom.C:14
 quasirandom.C:15
 quasirandom.C:16
 quasirandom.C:17
 quasirandom.C:18
 quasirandom.C:19
 quasirandom.C:20
 quasirandom.C:21
 quasirandom.C:22
 quasirandom.C:23
 quasirandom.C:24
 quasirandom.C:25
 quasirandom.C:26
 quasirandom.C:27
 quasirandom.C:28
 quasirandom.C:29
 quasirandom.C:30
 quasirandom.C:31
 quasirandom.C:32
 quasirandom.C:33
 quasirandom.C:34
 quasirandom.C:35
 quasirandom.C:36
 quasirandom.C:37
 quasirandom.C:38
 quasirandom.C:39
 quasirandom.C:40
 quasirandom.C:41
 quasirandom.C:42
 quasirandom.C:43
 quasirandom.C:44
 quasirandom.C:45
 quasirandom.C:46
 quasirandom.C:47
 quasirandom.C:48
 quasirandom.C:49
 quasirandom.C:50
 quasirandom.C:51
 quasirandom.C:52
 quasirandom.C:53
 quasirandom.C:54
 quasirandom.C:55
 quasirandom.C:56
 quasirandom.C:57
 quasirandom.C:58
 quasirandom.C:59
 quasirandom.C:60
 quasirandom.C:61
 quasirandom.C:62
 quasirandom.C:63
 quasirandom.C:64
 quasirandom.C:65
 quasirandom.C:66
 quasirandom.C:67
 quasirandom.C:68
 quasirandom.C:69
 quasirandom.C:70
 quasirandom.C:71
 quasirandom.C:72
 quasirandom.C:73
 quasirandom.C:74
 quasirandom.C:75
 quasirandom.C:76
 quasirandom.C:77
 quasirandom.C:78
 quasirandom.C:79
 quasirandom.C:80
 quasirandom.C:81
 quasirandom.C:82
 quasirandom.C:83
 quasirandom.C:84
 quasirandom.C:85
 quasirandom.C:86
 quasirandom.C:87
 quasirandom.C:88
 quasirandom.C:89
 quasirandom.C:90
 quasirandom.C:91
 quasirandom.C:92
 quasirandom.C:93
 quasirandom.C:94
 quasirandom.C:95
 quasirandom.C:96
 quasirandom.C:97
 quasirandom.C:98
 quasirandom.C:99
 quasirandom.C:100
 quasirandom.C:101
 quasirandom.C:102
 quasirandom.C:103
 quasirandom.C:104
 quasirandom.C:105
 quasirandom.C:106
 quasirandom.C:107
 quasirandom.C:108
 quasirandom.C:109
 quasirandom.C:110