【问题标题】:C++ generation of random numbers [duplicate]C ++生成随机数[重复]
【发布时间】:2012-12-17 16:19:15
【问题描述】:

可能重复:
how to generate different random number in a loop in 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

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

【问题讨论】:

  • 将对srand()的调用移出循环。
  • 既然你说你用的是C++,那你可以看看C++11新的pseudo random functionality,尤其是std::uniform_int_distribution这个类,它可以用来生成一个范围内的随机数.链接中有一个如何使用它的示例。
  • @arjun 您尝试将srand 移出循环,但没有任何改变?我觉得很难相信。您能否检查一下:1)您是否从循环内部删除 srand改为在循环之前将其插入,2)您是否在进行更改后实际重新编译了程序?
  • @jogojapan 最后我发现很难相信srand 是错误的,因为他也把它放出来了,而且每次都是不同的数字(鉴于他显示了正确的输出,这可能不是因为他的代码错过了他的输出中存在的空格,嗯)。
  • 为了将来参考,当在帖子中包含该代码的代码和输出时,请使其成为产生输出的确切代码。也请阅读sscce.org

标签: c++ random


【解决方案1】:

您重复获得相同结果的原因是因为您每次都使用相同的种子对其进行初始化。也就是说,由于您执行的操作如此之少,因此从循环的第一次迭代到最后一次迭代没有经过一秒钟。因此,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);
    }
 }

【讨论】:

  • 我试过上面的代码。它仍然产生与以前相同的结果。
  • 你确定他每次迭代都得到相同的时间(因为他把它拿出来,而且数字在我看来不一样)?
  • 对不起我的错...它现在工作..谢谢你
  • @ChristianRau 这是一个有效的观点。在他的示例数据中,调用之间增加了 +1 秒。有趣的问题是:他的代码和数据是在写这篇文章时复制粘贴还是重新创建的?
  • @Agentlien 最后他的代码错过了他输出中的空格,这让我相信他甚至没有显示正确的输出,所以你的答案可能是对的。
【解决方案2】:

您必须将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);
}
}

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

【讨论】:

  • 我试过上面的代码。仍然给出相同的随机数集
  • @arjun 在这种情况下变量 min 是什么?
  • 它是 0.. 对不起我的坏...它现在正在工作.. 谢谢
【解决方案3】:
srand(time(NULL));
printf("%d", rand() % 10+1);
for(i=1; i<rand()% max_length; i++) {
  printf("%ld", rand() % 10);
}

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我尝试使用睡眠。产生相同的结果:(
    • 用纯 C 重新编译它并执行它......它应该吐出不同的数字。嘿,您发布了一个似乎不是由您的程序生成的输出!
    • 我不遵循这个解释;当然rand 的状态只能通过调用rand 来提升;这如何导致观察到的问题?
    • rand 的状态只能通过在 C 中调用 rand 来提升。在 C++ 中,这不能保证cplusplus.com/reference/cstdlib/rand
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2018-06-25
    • 2016-08-20
    • 1970-01-01
    • 2012-08-10
    • 2012-11-16
    相关资源
    最近更新 更多