Why rand
是个坏主意
您在这里得到的大多数答案都利用了rand
函数和模运算符。那个方法可能无法统一生成数字(这取决于范围和值RAND_MAX
),因此不鼓励。
C++11 和一定范围内的生成
随着 C++11 的出现,出现了多种其他选项。其中一个非常适合您的要求,可以很好地生成一定范围内的随机数:std::uniform_int_distribution。这是一个例子:
#include <iostream>
#include <random>
int main()
{
const int range_from = 0;
const int range_to = 1000;
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(range_from, range_to);
std::cout << distr(generator) << '\n';
}
Try it online on Godbolt
And here'是正在运行的示例。
模板功能可能会有所帮助:
template<typename T>
T random(T range_from, T range_to) {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<T> distr(range_from, range_to);
return distr(generator);
}
其他随机生成器
The <random> header提供无数其他具有不同类型分布的随机数生成器,包括伯努利分布、泊松分布和正态分布。
如何洗牌容器?
该标准规定std::shuffle,可以按如下方式使用:
#include <iostream>
#include <random>
#include <vector>
int main()
{
std::vector<int> vec = {4, 8, 15, 16, 23, 42};
std::random_device random_dev;
std::mt19937 generator(random_dev());
std::shuffle(vec.begin(), vec.end(), generator);
std::for_each(vec.begin(), vec.end(), [](auto i){std::cout << i << '\n';});
}
Try it online on Godbolt
该算法将以线性复杂度随机重新排序元素。
增强随机
如果您无法访问 C++11+ 编译器,另一种选择是使用增强随机。它的界面与 C++11 非常相似。