生成伪随机16位整数

Mar*_*ila 9 c++ random mersenne-twister c++11

我需要生成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);
Run Code Online (Sandbox Code Playgroud)

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

using mt19937 = mersenne_twister_engine<unsigned int, 
                                        32, 624, 397, 
                                        31, 0x9908b0df,
                                        11, 0xffffffff, 
                                        7, 0x9d2c5680, 
                                        15, 0xefc60000, 
                                        18, 1812433253>;
Run Code Online (Sandbox Code Playgroud)

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

我希望更好的解决方案是将自己定义的mersenne_twister_engine引擎用于16位整数.但是,我没有找到任何提到的模板参数集(例如,可以在这里找到需求).有吗?

更新:我通过正确的分发初始化更新了代码示例.

Bat*_*eba 8

你的方式确实是正确的方法.

数学论证是复杂的(我将尝试挖掘一篇论文),但是采用由C++标准库实现的Mersenne Twister中最不重要的部分是正确的做法.

如果您对序列的质量有任何疑问,请通过死硬测试.

  • @ user463035818:对于真正的发电机来说这是真的,但对其他发电机肯定不行.例如,对于线性同余生成器,连续通常是奇数 - >偶数 - >奇数 - >偶数,这意味着最低有效位是相当确定的! (5认同)
  • 要添加到_odd-> even-> odd-> even_:AFAIK,`rand()`特别容易以2的幂为模.2的幂越小,它就变得越确定.当我打算用4种棕色和"rand()"制作沙子纹理时,我曾经意识到这一点.它给出了一个重复的图案(看起来像一个奇怪的70年代的壁纸).将颜色增加到5(素数)依次产生完全令人满意的结果.:-) (2认同)