2012-09-06 17 views
2

該程序產生的隨機串的3倍C++代碼結果輸出不同,這取決於執行方法調試VS運行

在蝕與調試「步驟爲」

結果當結果是獨特的,不同的是相同的字符串時,3次剛剛執行

爲什麼結果會因執行方法,調試與編譯運行不同而不同?

#include <iostream> 
using std::cout; 
using std::endl; 

#include <string> 
using std::string; 

#include <ctime> 
#include <cstdlib> 


string generaterandomstring(int length){ 
    int i, x, alphabetsize, asciioffset; 
    string s1; 

    alphabetsize = 26; // size of all lower case letters 
    asciioffset = 97; // lower case letters start at 97 

    srand (time(NULL)); 

    for (i = 0; i < length; i++) 
    { 
     //generate random number 
     x = rand() % alphabetsize + asciioffset; 
     cout << "x: " << x; 
     //get a letter 
     cout << " char: " << char(x); 
     //append it to string 
     s1 = s1 + char(x); 
     cout << " s1: " << s1 << endl; 
    } 
    return s1; 
} 

int main() { 
    int i; 
    string s1; 
    int length = 3; 

    srand (time(NULL)); 

    for (i = 0; i < length; i++) 
    { 
     s1 = generaterandomstring(length); 
     cout << "i is: " << i << " from main s1: " << s1 << endl; 
     cout << rand() % 10 << endl; 
    } 

    cout << "!The End!" << endl; // prints !!!Hello World!!! 
    return 0; 
} 
+2

查找一個「種子」是什麼,你應該如何使用它。 –

+0

你錯誤地使用了srand,這就是爲什麼。 – Shark

+0

無關:使用''a''作爲'asciioffset'更具可讀性。 –

回答

1

http://cplusplus.com/reference/clibrary/cstdlib/srand/

僞隨機數發生器是利用作爲種子傳遞的參數初始化。

對於srand調用中使用的每個不同的種子值,可以預期僞隨機數發生器在隨後的rand調用中產生不同的連續結果。 使用相同種子的兩種不同的初始化指示僞隨機生成器生成相同的一系列結果,以便在後續對rand的調用

http://cplusplus.com/reference/clibrary/ctime/time/

獲取當前日曆時間time_t表示對象。

0

這是因爲你叫srandgeneraterandomstring。在調試會話期間,迭代之間需要足夠的時間(超過一秒),以便time(NULL)每次都返回不同的值。在自由運行時,程序將隨機種子設置爲相同的值,並在每次迭代中獲得相同的「隨機」值。

0

爲什麼它在調試的原因在於調試足夠慢,你在毫秒當前時間函數srand的重新初始化產生不同的隨機字符串。在發行版中,代碼太快,所以srand正在重新初始化爲相同的隨機數列表。正如另一個答案建議你應該只調用一次srand一次。雖然如果你在睡眠時間1毫秒內睡覺,那麼問題就會消失。

相關問題