c++ - 生成伪随机 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++ 标准库实现的 Mersenne Twister 的最低有效位是正确的做法。
如果您对序列的质量有任何疑问,请通过顽固的测试来运行它。
推荐阅读
- keycloak - 所有按钮上的帐户控制台内部服务器错误
- c - 在 C 中的结构中传递值
- swift - 如何在 Swift 5 中仅使用 MapKit 显示城市
- php - 试图从我的用户表中选择 user_id = 1 但出现错误
- c# - TcpClient 连接正常,没有错误,但是没有收到数据包
- oracle - Oracle 嵌套 SUBSTR 比较
- css - 按钮内的 Svg 高度与文本不同
- javascript - 打印带有验证号的三角形
- authentication - 是否可以使用带有 PKCE 的授权代码流自动登录到 Azure AD B2C
- ios - 是否可以使用 URLScheme 从一个 ViewController 移动到另一个 ViewController?