File indexing completed on 2026-05-03 08:13:59
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___RANDOM_GENERATE_CANONICAL_H
0010 #define _LIBCPP___RANDOM_GENERATE_CANONICAL_H
0011
0012 #include <__config>
0013 #include <__random/log2.h>
0014 #include <cstdint>
0015 #include <initializer_list>
0016 #include <limits>
0017
0018 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0019 # pragma GCC system_header
0020 #endif
0021
0022 _LIBCPP_PUSH_MACROS
0023 #include <__undef_macros>
0024
0025 _LIBCPP_BEGIN_NAMESPACE_STD
0026
0027
0028
0029 template <class _RealType, size_t __bits, class _URNG>
0030 _LIBCPP_HIDE_FROM_ABI _RealType generate_canonical(_URNG& __g) {
0031 const size_t __dt = numeric_limits<_RealType>::digits;
0032 const size_t __b = __dt < __bits ? __dt : __bits;
0033 #ifdef _LIBCPP_CXX03_LANG
0034 const size_t __log_r = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value;
0035 #else
0036 const size_t __log_r = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value;
0037 #endif
0038 const size_t __k = __b / __log_r + (__b % __log_r != 0) + (__b == 0);
0039 const _RealType __rp = static_cast<_RealType>(_URNG::max() - _URNG::min()) + _RealType(1);
0040 _RealType __base = __rp;
0041 _RealType __sp = __g() - _URNG::min();
0042 for (size_t __i = 1; __i < __k; ++__i, __base *= __rp)
0043 __sp += (__g() - _URNG::min()) * __base;
0044 return __sp / __base;
0045 }
0046
0047 _LIBCPP_END_NAMESPACE_STD
0048
0049 _LIBCPP_POP_MACROS
0050
0051 #endif