首页 > 解决方案 > 生成伪随机 16 位整数

问题描述

我需要生成 16 位伪随机整数,我想知道最好的选择是什么。

我想到的明显方法如下:

std::random_device rd;
auto seed_data = std::array<int, std::mt19937::state_size> {};
std::generate(std::begin(seed_data), std::end(seed_data), std::ref(rd));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
std::mt19937 generator(seq);
std::uniform_int_distribution<short> dis(std::numeric_limits<short>::min(), 
                                         std::numeric_limits<short>::max());

short n = dis(generator);

我在这里看到的问题是std::mt19937产生 32 位无符号整数,因为它被定义为:

using mt19937 = mersenne_twister_engine<unsigned int, 
                                        32, 624, 397, 
                                        31, 0x9908b0df,
                                        11, 0xffffffff, 
                                        7, 0x9d2c5680, 
                                        15, 0xefc60000, 
                                        18, 1812433253>;

这意味着静态转换已完成,并且分发只使用这些 32 位整数的最低有效部分。所以我想知道这些伪随机短裤系列有多好,我没有数学专业知识来回答这个问题。

我希望更好的解决方案是使用您自己定义的mersenne_twister_engine引擎来处理 16 位整数。但是,我还没有找到任何提到的模板参数集(例如,可以在此处找到要求)。有吗?

更新:我更新了代码示例,对分发进行了适当的初始化。

标签: c++c++11randommersenne-twister

解决方案


你的方法确实是正确的方法。

数学论点很复杂(我将尝试挖掘一篇论文),但采用 C++ 标准库实现的 Mersenne Twister 的最低有效位是正确的做法。

如果您对序列的质量有任何疑问,请通过顽固的测试来运行它。


推荐阅读