2010-10-18 69 views
9

我注意到,那個標準的rand()函數在Windows和Linux上給出了不同的結果。當然我使用了相同的種子編號(1234)。這裏有幾首結果:Windows和Linux上不同的rand()結果

WIN:4068 213 12761 8758

LIN:479142414 465566339 961126155 1057886067

我的應用程序需要兩個平臺產生相同的輸出。 我有什麼選擇?是否有任何替代rand()符合我的要求?

謝謝

PS。我在Windows7上使用了MSVC 2008,而在CentOS 5.5上使用了gcc 4.1.2。

+2

爲什麼你需要隨機數字在不同平臺上是相同的?畢竟,這不是非常隨意的 - 你想達到什麼目的? – 2010-10-18 12:26:05

+0

@EamonNerbonne可能的場景:在linux和cygwin下開發的應用程序,並通過隨機測試進行測試。每次測試都會打印種子。如果測試發現錯誤情況,可以在種子的幫助下重現錯誤情況。如果你想調試linux和cygwin上的錯誤情況,如果'rand'會在linux和cygwin下返回相同的隨機序列將會非常好。 – Tobias 2017-12-11 08:48:37

回答

19

Boost有一個wide range of RNGs,推測其跨平臺具有可重現的行爲。

+0

Boost PRNG都提到了他們實現的算法和所選參數。因此,這種行爲不僅可以重複使用,還可以在數學上進行定義(即存在正確性的絕對標準) – MSalters 2010-10-19 09:24:17

4

由於在任一平臺上功能的實現不同,您不會得到相同的結果。

7
+0

爲什麼「不推薦」?一個LCG是一個簡單的單線程,維基百科文章提供了一個常用常量列表,可以產生或多或少的良好行爲(與C標準庫實現一致)。 – 2010-10-18 11:53:36

+5

不推薦,因爲實現的正確性很難測試,並且任何錯誤都不會立即顯現,但可能會在應用程序執行過程中稍後導致問題。另外,爲什麼重新發明輪子? – 2010-10-18 11:55:20

+0

@Eamon:「爲什麼要重新發明輪子?」這是一個frackin'**單線**。下載Boost頭文件(儘管這也是我推薦的第一個解決方案)可以保證更多的工作。一般來說,我會同意正確性。但再一次:這是一個單線。我從維基百科複製的。有什麼會出錯的? – 2010-10-18 12:00:51

-4

你可以試試函數srand(INT),其基於種子(輸入)隨機數

- 我想你甚至會發現不同的Linux版本 乾杯

+2

確實如此,但只有底層算法和參數也相同時,結果纔會相同。 – 2010-10-18 11:54:31

3

返回不同的值,以及不同的窗口版本返回不同的值。例如,您可以通過使用glibc one來統一您的隨機生成器。

你正在寫自己的函數另一種選擇做ONLY如果你是100%肯定,你不需要使用隨機對密碼的使用或者需要的東西要具有不可預見性任何其他用途或統一性或其他隨機性質。

6

如果你滿意的標準執行rand,只需要再生性,你可以很容易地編寫自己的linear congruential generator(適應C接口,可能不是一個很好的選擇 - 而改用一類!):

namespace myown { 

static int state; 

void srand(int seed) { 
    state = seed; 
} 

int rand() { 
    int const a = 1103515245; 
    int const c = 12345; 
    state = a * state + c; 
    return (state >> 16) & 0x7FFF; 
} 

} 

這使用維基百科文章中的常量(ANSI C:Watcom)。

也就是說,我寧願按照其他人的建議,使用Boost提供的讀取實現。

+0

對於問題的正確答案+1(OP需要可複製性,而不是一個好的RNG)。只要記得在完成測試後使用好的RNG> ;-) – smirkingman 2010-10-18 12:49:10

相關問題