2013-03-02 47 views

回答

5

srandom和家人是glibc的成員。您可以將the source code from glibc srandom/random複製到您的應用程序中,只要它與許可證兼容即可。如果您正在尋找另一種實現方式,請注意,POSIX實際上是接口一致性,而不是實現一致性 - 它實際上沒有說明生成它的機制是什麼,也不是實際產生的數字應該。

如果您希望在多個平臺上保證相同的數字序列,那麼您不應該依賴任何隨機數生成器的標準庫實現,您應該自己製作或循環使用已知的實現。

爲在JWWalker的評論中提到,有一個相當不錯的boost random implementation,它提供了一套很好C++類的隨機數,但是這C++,不C - 不同的語言,所以可能不能直接適用。

+0

對於開源隨機數生成器,請參見[隨機庫Boost](http://www.boost.org/doc/libs/1_61_0/doc/html/boost_random/reference.html)。 – JWWalker 2016-06-08 19:19:57

+0

鏈接已死亡。我有一個需要編譯的文件,我應該怎麼做來替換srandom? – 2017-01-10 02:27:55

+0

@TomášZato我已經更新了鏈接,指向glibc random.c的sourceware鏈接,它應該爲可預見的將來保持活力。它是glibc代碼,並且有與其關聯的許可證,可能會使其不適合使用。 – Petesh 2017-01-10 08:45:36

1

您可以在Windows中檢查rand_ssrand函數。但是,我不確定它們是否符合POSIX標準。

編輯

一個更好的似乎是CryptGenRandom。 查看詳情,請點擊此處link

+0

'rand_s'不使用'srand'設置的種子,'rand'返回一個15位隨機數,與'random'返回的31位隨機數不同。 – JWWalker 2016-06-08 18:57:50

0

如果你正在尋找一些簡單的僞隨機數發生器可以用線性同餘發生器http://en.wikipedia.org/wiki/Linear_congruential_generator

如。第一個例子:

unsigned int seed = 2; 

unsigned int rand() 
{ 
    seed = 1664525 * seed + 1013904223; 
    return x; 
} 

void srand(unsigned int new_seed) 
{ 
    seed = new_seed; 
} 
+1

注意**未定義行爲**!你可以用'unsigned'來代替UB,而不是 – pmg 2013-03-02 10:42:54

+0

你是對的 - >編輯 – 2013-03-02 10:46:17

+2

這不能編譯。什麼是x變量? – swdev 2016-06-18 07:06:37