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位整数.但是,我没有找到任何提到的模板参数集(例如,可以在这里找到需求).有吗?
更新:我通过正确的分发初始化更新了代码示例.
你的方式确实是正确的方法.
数学论证是复杂的(我将尝试挖掘一篇论文),但是采用由C++标准库实现的Mersenne Twister中最不重要的部分是正确的做法.
如果您对序列的质量有任何疑问,请通过死硬测试.
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |