2014-12-04 100 views
2

srand(time(0))似乎没有正确地播种rand(),生成的第一个数字总是相同的。第一个rand()在srand(time(0))后生成相同的值

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

在您的问题中无法找到任何特定的Xcode。删除了标签。 – 2014-12-04 18:25:10

+2

在程序运行之间等待多久?只要我在两次运行之间等待至少一秒,我就会在Windows上得到不同的数字。 – 2014-12-04 18:27:58

+0

您应该包含stdlib.h或cstdlib和time.h或ctime以确保您使用的函数的原型可见。 – 2014-12-04 18:28:53

回答

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

sranddev()做到了。非常感谢。我将读到OX上srand和sranddev之间的区别。 – Visions23 2014-12-04 19:52:01

+2

在大多数现代的POSIX系统中,arc4random_uniform()应该是随机生成器,因为它避免了播种和模偏差。只有不需要使用它的理由是,如果您需要较低质量的发电机的更高性能。 – 2014-12-04 20:12:11

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

+0

感谢您的回复,至今我还在学习C++, (信息系统本科),我运行在线编译器的代码,它的工作原理,我试着在codeblocks上,但问题似乎与xcode。 – Visions23 2014-12-04 19:21:06

0

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

相关问题