我需要在指定的时间间隔内生成随机数,[max;min]。
此外,随机数应均匀分布在区间上,而不是位于特定点。
目前我正在生成:
for(int i=0; i<6; i++)
{
DWORD random = rand()%(max-min+1) + min;
}
根据我的测试,随机数仅在一点附近生成。
Example
min = 3604607;
max = 7654607;
生成的随机数:
3631594
3609293
3630000
3628441
3636376
3621404
从下面的答案:好的,RAND_MAX 是 32767。我在 C++ Windows 平台上。有没有其他方法可以生成均匀分布的随机数?
原文由 anand 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么
rand
是个坏主意您在这里得到的大多数答案都使用了
rand
函数和模运算符。该方法 可能不会统一生成数字(它取决于RAND_MAX
的范围和值),因此不鼓励使用。C++11 和生成范围内
在 C++11 中,出现了多种其他选择。其中一个符合您的要求,可以很好地生成一个范围内的随机数:
std::uniform_int_distribution
。这是一个例子:在 Godbolt 上在线尝试
这 是正在运行的示例。
模板功能可能会有所帮助:
其他随机发生器
<random>
标头 提供了无数其他具有不同分布类型的随机数生成器,包括伯努利、泊松和正态分布。我怎样才能洗牌一个容器?
标准提供了
std::shuffle
,可以使用如下:在 Godbolt 上在线尝试
该算法将随机重新排序元素,具有线性复杂度。
Boost.Random
如果您无法访问 C++11+ 编译器,另一种选择是使用 Boost.Random 。它的界面与 C++11 非常相似。