2014-12-04 94 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或更高似乎也起作用。

相關問題