0

可能重复:
如何在 C++ 的循环中生成不同的随机数?

这是我的代码:

 for(i=0;i<10;i++)
 {
    srand ( time(NULL) );
    cout<<time(NULL);
    max=100,min=0;
    for(j=0;j<3;j++)
    {
          cout<<(( (rand() % (max - min + 1)) + min)%5);
    }
 }

现在我得到输出:

1357207288 0 1 4

1357207289 0 1 4

1357207290 0 1 4

等等。我想每次都得到不同的随机数。我怎样才能做到这一点。

4

4 回答 4

8

您重复获得相同结果的原因是因为您每次都使用相同的种子对其进行初始化。也就是说,由于您执行的操作如此之少,因此从循环的第一次迭代到最后一次迭代没有经过一秒钟。因此,time(nullptr)每次迭代都会返回相同的值。

要解决这个问题,请移出srand ( time(NULL) );循环,这意味着只设置一次随机种子。

 srand ( time(NULL) );
 for(int i=0;i<10;i++)
 {
    cout<<time(NULL);
    int max=100;
    for(int j=0;j<3;j++)
    {
          cout<<(( (rand() % (max - min + 1)) + min)%5);
    }
 }
于 2013-01-03T10:07:36.183 回答
3

您必须移出srand()循环,否则您会收到相同的数字。

srand ( time(NULL) );
for(i=0;i<10;i++)
{
cout<<time(NULL);
max=100,
for(j=0;j<3;j++)
{
      cout<<(( (rand() % (max - min + 1)) + min)%5);
}
}

如果你不这样做,你将使用相同的种子,因为时间不会在你的程序执行所需的纳秒内改变。

于 2013-01-03T10:11:33.273 回答
1
srand(time(NULL));
printf("%d", rand() % 10+1);
for(i=1; i<rand()% max_length; i++) {
  printf("%ld", rand() % 10);
}

这将生成随机数(也是它们的随机长度)。

于 2013-01-03T10:08:35.067 回答
1

即使 srand() 退出循环,您也会得到相同的结果,因为在 C 中,rand 使用的生成算法只能通过调用此函数来保证。在 C++ 中,这个约束被放宽了,并且允许库实现在其他情况下推进生成器(例如调用 的元素<random>)。在循环中放置一个睡眠,看看会发生什么。

显然,在纯 C 中这不会发生。然而,boost 库为您提供了一些很好的 PRNG 功能。用它代替破碎的srand(time(NULL));

于 2013-01-03T10:15:04.407 回答