我需要生成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位整数的最低有效部分进行分布。因此,我想知道这些伪随机shorts序列有多好,但我没有数学专业知识来回答。
我期望更好的解决方案是使用您自己定义的mersenne_twister_engine
引擎用于16位整数。然而,我没有找到任何提及的模板参数集(可以在此处找到要求)。有吗?
更新:我使用适当的初始化方式更新了代码示例。
std::uniform_int_distribution
的分布范围:std::uniform_int_distribution<short> dis(std::numeric_limits<short>::min(), std::numeric_limits<short>::max());
- Some programmer dude0
作为范围的底部。 - Some programmer dudedieharder
实例中,rand()
在前10个统计测试中只通过了3个,而 mt19937 则通过了9个并且一个是弱通过。有时候,提问者已经知道如何正确使用<random>
,但你还是引诱他加入黑暗面...这真是令人费解。至于过早优化,顺便说一下,return 0;
是一个非常快的 PRNG。(哦,而rand()
只提供15位有效数字。) - Arne Vogel