C++ 我如何知道std::seed的正确大小?

C++ 我如何知道std::seed的正确大小?,c++,c++11,random,C++,C++11,Random,由于篇幅的原因,我不得不稍微滥用这个术语。请稍等片刻 std::seed_seq用于为伪随机生成器设置种子。通常,我准备一个std::arrayofuint32\u t并填充一个真正的随机数(通过std::random\u device*),然后将开始和结束迭代器传递给std::seed\u seq(参见示例代码) 问题是,给定某个伪随机生成器(例如,std::mt19937),我如何知道要在最佳状态下播种的数组的正确大小? 关于std::mt19937,由于状态大小是19937位,我猜它是62

由于篇幅的原因,我不得不稍微滥用这个术语。请稍等片刻

std::seed_seq
用于为伪随机生成器设置种子。通常,我准备一个
std::array
of
uint32\u t
并填充一个真正的随机数(通过
std::random\u device
*),然后将开始和结束迭代器传递给
std::seed\u seq
(参见示例代码)

问题是,给定某个伪随机生成器(例如,
std::mt19937
),我如何知道要在最佳状态下播种的数组的正确大小? 关于
std::mt19937
,由于状态大小是19937位,我猜它是624
uint32\u t
s,是这样吗?知道的一般方法是什么

std::mt19937 init_mersenne_twister() {                                        
    //624 is the internal state sequence size of mt19937
    std::array<std::uint32_t, 624> seed_bits{};                               

    std::random_device real_random{};                                         
    std::generate(seed_bits.begin(), seed_bits.end(), std::ref(real_random)); 
    std::seed_seq wrapped_seed_bits(seed_bits.begin(), seed_bits.end());      

    return std::mt19937(wrapped_seed_bits);                                   
}                                                                             
std::mt19937初始化梅森扭曲器(){
//624是mt19937的内部状态序列大小
std::数组种子_位{};
std::random_device real_random{};
std::generate(seed_bits.begin()、seed_bits.end()、std::ref(real_random));
std::seed_seq包装的_seed_位(seed_位.begin(),seed_位.end());
返回std::mt19937(包装的种子位);
}                                                                             

*我知道random_设备可能不可用,但这不是问题的关键。

Read,看起来2^19937是一个循环,它与SEED无关。我认为这两个概念是相连的。在初始化部分中,解释了状态是每个w位的n个值。对于std::mt19937,它们实际上是624和32。对于std::mt19937,可以使用std::mt19937::state\u size。对于其他人,您必须阅读标准才能查看内部状态的大小。然而,在我看来,用19968位的熵为std::mt19937播种是没有意义的。256位的熵对于任何目的都是足够的。您无法区分std::mt19937的两个实例,一个是256位熵的种子,另一个是19968位熵的种子。我不知道您对“任何目的”的定义,但2^256个起始种子不足以获得60个元素数组的所有可能洗牌。。。顺便说一句,洗牌正是我的使用案例。由于阶乘增长如此之快,即使是2^19937对于一个2000个元素的数组也几乎不够。