第一个 rand() 在 srand(time(0) 之后生成相同的值

first rand() generates the same value after srand(time(0))

本文关键字:后生 rand srand time 第一个 之后      更新时间:2023-10-16

srand(time(0))似乎没有正确播种rand(),生成的第 1 个数字始终相同。

这是在OS X上运行的,我的设置或代码有问题吗?我确实等待了几秒钟以重新运行该程序。第一个数字仅在一天后递增,其余数字始终是随机的。

#include<iostream>
using namespace std;
int main ()
{
    int Num1,Num2;
    // seed the random number generator
    srand((unsigned int )time(NULL));
    Num1 = rand() %49 +1 ;
    do {Num2 = rand() % 49 + 1;}
    while(Num2 == Num1);
    ///Display Random Numbers
    cout<<"Numbers are: "<<endl;
    cout<<Num1<<" "<<Num2<<endl<<endl;
    return 0;
}

你得到的是相同的数字,因为种子的价值非常接近,随机生成器还没有时间发散。 在OS X上使用sranddev()而不是srand(),它将为您提供更好的种子并避免此问题。

#include<iostream>
using namespace std;
int main()
{
  int a, b;
  // seed the random number generator
  sranddev();
  a = rand();
  b = rand();
  cout << a << " " << (a % 49) + 1 << endl
       << b << " " << (b % 49) + 1 << endl << endl;
  return 0;
}

假设您可以访问 C++11,这样的事情会更好:

#include <iostream>
#include <random>
int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 50);
    std::cout << "Numbers are: " << dis(gen) << " " << dis(gen) << "n";
    return 0;
}

rand通常是一个非常糟糕的随机生成器,值范围有限,使用% N来限制值会使情况变得更糟。 这里有一个关于为什么 rand 不是一个好的选择的演示文稿:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

除了使用 sranddev() 而不是 rand()。将范围也从 %49 增加到 50 或更高似乎也有效。