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

时间:2014-12-04 18:14:58

标签: c++ macos

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

这是在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;
}

3 个答案:

答案 0 :(得分:1)

你得到的数字相同,因为种子价值非常接近,随机发生器还没有时间分歧。在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;
}

答案 1 :(得分: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来限制值会使其更糟糕。关于为什么兰德在这里不是一个好选择的演讲:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

答案 2 :(得分:0)

除了使用sranddev()而不是rand()。增加范围也形成%49至50或更高似乎也起作用。

相关问题