【问题标题】:rand() function generates the next number by ascending to the previous numberrand() 函数通过升序到前一个数字来生成下一个数字
【发布时间】:2019-08-18 03:52:02
【问题描述】:

请检查下面给出的代码。它每次执行生成的随机数是上一次执行时生成的随机数的增量。

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    srand(time(NULL));

    cout<<"\n Random Number : "<<rand()<<endl;

    cin.get();
    return 1;
}

请执行5-6次,你会看到每次执行的随机数都在增加,并且非常接近。

注意:请使用 CodeBlocks 或 Visual Studio 进行检查,而不是在线编译器。

【问题讨论】:

  • 对于rand()的随机性几乎没有任何保证。您的行为可能是由于每次测试时srand 都使用稍大的值(当前时间)播种。它可能只是在每次第一次调用时返回种子,或者与它密切相关的东西。
  • time(NULL) 以秒为单位提供整数形式的时间,因此如果您在同一秒内调用该程序两次,您将获得两次相同的数字。如果你在下一秒调用它,你会得到完全不同的数字:ideone.com/McE7CD
  • 此外,您似乎比较了随机数,其中每个随机数由不同的种子生成,其中种子具有很强的关系。要获得任何有意义的内容,您必须查看从同一种子生成的大量随机数

标签: c++


【解决方案1】:

实际上,我找到了解决问题的方法,但它仍然可能无法回答我的问题。 无论如何,问题不在于srand()rand() 函数,而在于函数time(NULL)。由于我试图在 Windows 上运行此代码,而不是使用time(NULL) 作为srand() 的参数,我使用GetTickCount(),现在它为每次执行正确生成随机数。

#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;

int main()
{
    srand(GetTickCount());

    cout<<"\n Random Number : "<<rand();

    cout<<"\n";
    cin.get();
    return 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2023-03-09
    • 2018-03-12
    相关资源
    最近更新 更多