我需要生成一个介于 1 和 n 之间的随机数,其中 n 是无符号整数。如果 n 是 int 我会简单地写1 + rand()% n
. 但不幸的是 n 是无符号整数。你有什么建议?
问问题
2368 次
1 回答
11
rand() 应尽可能避免*。使用http://en.cppreference.com/w/cpp/numeric/random
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 engine(rd());
std::uniform_int_distribution<unsigned> dist(1, 77);
for (int i = 0; i != 5; ++i)
std::cout << dist(engine) << '\n';
}
* 因为它共享一个全局状态,所以经常被实现为一个线性同余引擎,它有一些缺点,它的范围通常只有 0-2^16。此外,其中 n 不是范围的精确倍数的 %n不会产生均匀分布。
编辑:这可能看起来有点矫枉过正,但从技术上讲,人们会想要这样的东西,因为 mt19937 需要一点“热身”:
std::mt19937 create_seeded_rng()
{
std::random_device rd;
std::array<std::mt19937::result_type, std::mt19937::state_size> seed_data;
std::generate(seed_data.begin(), seed_data.end(), std::ref(rd));
std::seed_seq seq(seed_data.begin(), seed_data.end());
return std::mt19937(seq);
}
int main()
{
std::mt19937 rng = create_seeded_rng();
std::uniform_int_distribution<int> dist(0, 100);
for (unsigned i = 0; i != 100; ++i)
std::cout << dist(rng) << '\n';
}
于 2013-09-07T18:15:05.483 回答