【问题标题】:Cpp random number with rand returns very similar numbers带有 rand 的 Cpp 随机数返回非常相似的数字
【发布时间】:2025-11-24 20:05:02
【问题描述】:

我正在尝试使用 rand() 命令生成一个随机数,但每次我得到的数字都非常相似。 这是我的代码:

#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    srand(time(0));
    cout << rand();
    return 0;
}

我运行了 5 次,得到的数字是: 21767 21806 21836 21862 21888

我怎样才能使数字更加不同?

【问题讨论】:

  • 糟糕的随机数生成器,尤其是在 MS 平台上。请改用&lt;random&gt;amazing 产品。仅供参考,如果您确实使用了randsrand,则应该使用#include &lt;cstdlib&gt;,因为标准库要求使用该标头来访问这些函数。
  • 换句话说,您希望随机数不那么随机?
  • time() 具有秒精度,因此如果这 5 次运行非常接近,您将使用非常相似的起始值播种 RNG。一开始你不应该在 C++ 中使用 C rand() RNG,而是使用 &lt;random&gt; 库中的 C++ RNG。
  • 我希望数字更加不同,并且彼此之间不要那么接近

标签: c++ random random-seed


【解决方案1】:

来自documentation of rand

我们无法保证生成的随机序列的质量。过去,rand() 的一些实现在产生的序列的随机性、分布和周期方面存在严重缺陷(在一个众所周知的示例中,低位位在调用之间简单地在 1 和 0 之间交替)。 rand() 不推荐用于严重的随机数生成需求。建议使用 C++11 的随机数生成工具替换 rand()。

它(和我)建议在&lt;random&gt; 中使用较新的 c++11 随机数生成器。

在您的具体情况下,您似乎需要std::uniform_int_distribution。链接页面上给出的示例是:

std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(1, RAND_MAX);
std::cout << distrib(gen) << '\n';

【讨论】: