std::mersenne_twister_engine及其生成的取值范围
关于 std::mersenne_twister_engine 的文档:
w——决定引擎生成值范围的二的幂
基于在上一篇文章 generate random number in a range c++ [duplicate] 中概述的在区间内生成随机数的广泛使用的C++方法,是否可以认为这个区间来自为 std::uniform_int_distribution 指定的范围?
解决方案
是否可以假设这个区间取自为
std::uniform_int_distribution指定的区间?
不,w 只是第二个模板参数:
template<
class UIntType, std::size_t w, std::size_t n, std::size_t m, std::size_t r,
// ^^^^^^^^^^^^^
UIntType a, std::size_t u, UIntType d, std::size_t s,
UIntType b, std::size_t t, UIntType c, std::size_t l, UIntType f
> class mersenne_twister_engine;
正如在两个预定义的特化中所看到的:
在 std::mt19937 中,第二个参数是32,因此范围为 [0, 232)。
std::mersenne_twister_engine<std::uint_fast32_t,
32, 624, 397, 31,
0x9908b0df, 11,
0xffffffff, 7,
0x9d2c5680, 15,
0xefc60000, 18, 1812433253>
在 std::mt19937_64 中,第二参数是64,因此范围为 [0, 264)。
std::mersenne_twister_engine<std::uint_fast64_t,
64, 312, 156, 31,
0xb5026f5aa96619e9, 29,
0x5555555555555555, 17,
0x71d67fffeda60000, 37,
0xfff7eee000000000, 43,
6364136223846793005>
至于诸如 std::uniform_int_distribution 之类的分布,它们通过调用所提供的生成器来获得熵。生成器的比特宽度很可能不足以覆盖分布的所有取值范围。分布具有状态,可以多次调用生成器,以在该分布的取值范围内生成一个数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。