2011-08-18 34 views
4

我想生成一個隨機整數不同的輸出,所以我用C++蘭特(無效)和函數srand(INT)功能:C++蘭特和函數srand得到在不同的機器

int main(){ 
    srand(1); 
    cout << rand() << endl; 
    return 0; 
} 

OK,很適合我的需要。每次我執行它,我都會得到相同的結果,我喜歡它!
但有一個問題。當我在我的電腦上執行它時,我得到了16807的輸出。但是,當我執行到另一臺機器上,我得到了1804289383.

我知道RAND()和函數srand(INT)有一個類似的簡單的實現:

static unsigned long int next = 1; 

int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 

void srand(unsigned int seed) 
{ 
    next = seed; 
} 

那麼,爲什麼? rand()在多臺機器上有不同的實現嗎?我該怎麼辦?

我想修改另一臺機器,使得我也能從那臺機器上獲得16807。
請注意,我喜歡我的電腦上的蘭德實施。請讓我看看其他機器與我的結果相同的方式。

在此先感謝。

+0

16807可能是MacOS上的結果。這是一個非常糟糕的隨機生成器。 [爲什麼rand()%7總是返回0?](http://stackoverflow.com/q/7866754/995714) –

回答

8

是的,rand()有不同的實現;沒有要求它們是相同的。

如果您希望跨實現和平臺使用一致的序列,可以從the C standard的第7.20.2節複製樣本實現。請務必重命名randsrand,以免它們與標準庫的版本發生衝突。您可能需要對代碼進行調整,以使各種類型在實現中具有相同的大小和範圍(例如,使用uint32_t,而不是unsigned int)。

編輯:鑑於評論中提供了新的信息,它看起來像要求與我們認爲的不同(我仍然不完全清楚它們是什麼)。

您希望在兩個系統上生成與您在一個系統上生成的存儲文件一致的隨機數,但由於網絡問題而無法將其傳輸到另一個系統(該文件大約是千兆字節) 。 (它刻錄到DVD,或拆分,並將其刻錄成2張CD,是不是一種選擇?)

建議解決方案:

編寫生成兩個系統上一致的結果自定義生成器(即使他們與以前的結果不一樣)。完成之後,使用它在兩個系統上重新生成新的1千兆字節的數據文件。現有的文件變得不必要了,你不需要傳輸大量的數據。

+0

他他,哪個「基思湯普森」,這一個還是那個?我的意思是,「我們必須做點什麼,這是事情,所以我們必須這樣做。」一? –

+0

是的,我是The One(即The_Other)。 –

+0

+1'你可以複製示例實現' –

0

我認爲這是因爲你的兩個平臺上的int/unsigned int是不同的大小。整數/無符號整數在您編譯的兩臺機器/操作系統上具有相同的字節數?你使用的是什麼平臺/編譯器?

假設相同的rand/srand實現,您需要使用相同精度的數據類型(或相應的轉換)來獲得相同的結果。如果您的平臺上有stdint.h,請嘗試使用它(以便您可以定義顯式大小,例如uint32_t)。

1

C和C++規範沒有爲randsrand定義特定的實現。只要它有些隨意,它們可以是任何東西。您不能期望來自不同標準庫的一致輸出。

+0

沒錯。該標準爲給定的起始種子指定了一致的順序,但該保證不適用於各種實施。該標準還顯示了'srand()'和'rand()'的示例實現,但沒有要求使用它。 –

+0

好的,你說得對。但我該怎麼辦?我想手動實現一個rand函數,它在我的機器上獲得與標準rand相同的結果。我如何在我的機器上看到rand實現?它在哪裏?!我找不到它。 –

+0

不能解決'我該怎麼做?' –

1

rand的實現可以不同。如果你在不同的機器上需要相同的行爲,你需要一個隨機數生成器來提供。你可以推出自己的或者使用別人的。

我不確定C++ 0x庫中的隨機生成器是否足夠。我想不是。但是閱讀那裏的標準讓我頭腦轉動。我不確定Boost Random library是否足夠。但我認爲這值得檢查。在那裏你有源代碼,所以最糟糕的是它可以作爲你自己的基礎。

乾杯&第h。,