/*! * Copyright 2015 by Contributors * \file random.h * \brief Utility related to random. * \author Tianqi Chen */ #ifndef XGBOOST_COMMON_RANDOM_H_ #define XGBOOST_COMMON_RANDOM_H_ #include #include namespace xgboost { namespace common { /*! * \brief Define mt19937 as default type Random Engine. */ typedef std::mt19937 RandomEngine; #if XGBOOST_CUSTOMIZE_GLOBAL_PRNG /*! * \brief An customized random engine, used to be plugged in PRNG from other systems. * The implementation of this library is not provided by xgboost core library. * Instead the other library can implement this class, which will be used as GlobalRandomEngine * If XGBOOST_RANDOM_CUSTOMIZE = 1, by default this is switched off. */ class CustomGlobalRandomEngine { public: /*! \brief The result type */ typedef size_t result_type; /*! \brief The minimum of random numbers generated */ inline static constexpr result_type min() { return 0; } /*! \brief The maximum random numbers generated */ inline static constexpr result_type max() { return std::numeric_limits::max(); } /*! * \brief seed function, to be implemented * \param val The value of the seed. */ void seed(result_type val); /*! * \return next random number. */ result_type operator()(); }; /*! * \brief global random engine */ typedef CustomGlobalRandomEngine GlobalRandomEngine; #else /*! * \brief global random engine */ typedef RandomEngine GlobalRandomEngine; #endif /*! * \brief global singleton of a random engine. * This random engine is thread-local and * only visible to current thread. */ GlobalRandomEngine& GlobalRandom(); // NOLINT(*) } // namespace common } // namespace xgboost #endif // XGBOOST_COMMON_RANDOM_H_