【问题标题】:first rand() generates the same value after srand(time(0))第一个 rand() 在 srand(time(0)) 之后生成相同的值
【发布时间】:2014-12-04 18:14:57
【问题描述】:

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;
}

【问题讨论】:

  • 无法在您的问题中发现任何 Xcode 特定内容。删除了标签。
  • 程序运行之间您要等待多长时间?只要我在两次运行之间等待至少一秒钟,我就会在 Windows 上得到不同的数字。
  • 您应该包含 stdlib.h 或 cstdlib 和 time.h 或 ctime 以确保您正在使用的函数的原型是可见的。
  • 我确实等待了几秒钟以重新运行该程序。第一个数字仅在一天后增加,其余数字一如既往地随机。

标签: c++ macos


【解决方案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;
}

【讨论】:

  • sranddev() 成功了。非常感谢。我会在 OX 上阅读 srand 和 sranddev 之间的区别。
  • 在大多数现代 POSIX 系统上,arc4random_uniform() 应该使用随机生成器,因为它可以避免播种和模数偏差。不使用它的唯一原因是如果您需要较低质量生成器的更高性能。
【解决方案2】:

假设你可以访问 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

【讨论】:

  • 感谢您到目前为止的回复,我还在学习 C++,(信息系统本科),我在在线编译器上运行了代码,它可以工作,我会尝试使用代码块,但问题是似乎与xcode有关。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多