File indexing completed on 2025-08-06 08:17:26
0001 #include "PHRandomSeed.h"
0002 #include "recoConsts.h"
0003
0004 #include <iostream>
0005 #include <memory> // for allocator
0006 #include <queue>
0007 #include <random>
0008
0009 namespace
0010 {
0011 std::queue<unsigned int> seedqueue;
0012 std::mt19937 fRandomGenerator;
0013 std::uniform_int_distribution<unsigned int> fDistribution;
0014 }
0015
0016 bool PHRandomSeed::fInitialized(false);
0017 bool PHRandomSeed::fFixed(false);
0018 int PHRandomSeed::verbose(1);
0019
0020 unsigned int PHRandomSeed::GetSeed()
0021 {
0022 unsigned int iseed;
0023 if (!seedqueue.empty())
0024 {
0025 iseed = seedqueue.front();
0026 seedqueue.pop();
0027 }
0028 else
0029 {
0030 if (!fInitialized)
0031 {
0032 InitSeed();
0033 }
0034 if (fFixed)
0035 {
0036 iseed = fDistribution(fRandomGenerator);
0037 }
0038 else
0039 {
0040 std::random_device rdev;
0041 iseed = rdev();
0042 }
0043 }
0044 if (verbose)
0045 {
0046 std::cout << "PHRandomSeed::GetSeed() seed: " << iseed << std::endl;
0047 }
0048 return iseed;
0049 }
0050
0051 void PHRandomSeed::InitSeed()
0052 {
0053 recoConsts *rc = recoConsts::instance();
0054 if (rc->FlagExist("RANDOMSEED"))
0055 {
0056
0057 const unsigned int seed = rc->get_IntFlag("RANDOMSEED");
0058 std::cout << "PHRandomSeed: using fixed seed " << seed << std::endl;
0059 fRandomGenerator.seed(seed);
0060 fFixed = true;
0061 fInitialized = true;
0062 }
0063 }
0064
0065 void PHRandomSeed::LoadSeed(const unsigned int iseed)
0066 {
0067 seedqueue.push(iseed);
0068 }
0069
0070 void PHRandomSeed::Verbosity(const int iverb)
0071 {
0072 verbose = iverb;
0073 }