std::mersenne_twister_engine及其生成的取值范围

编程语言 2026-07-12

关于 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章