簡體   English   中英

Java中C的stdlib rand()函數

[英]C's stdlib rand() function in Java

我已經使用stdlib中的srand()rand()從C中的一個已知種子生成了一系列隨機數。 現在,我需要使用Java中C語言的相同種子來生成相同系列的數字。

Java的Random類文檔指出,它使用“線性同余公式”。 我在rand()上找到的文檔說它使用了“線性同余”生成器,盡管我不確定這是否用於一種特定的實現。

有誰知道如果給定相同的種子,或者對於Java是否存在srand()rand()端口,兩個生成器是否會產生相同的數字?

C標准不規定srand()和rand()的實現。 這樣,不同的環境(OS,C庫,體系結構等)很可能會產生相同種子值的不同數字序列。

同樣,實現Java的Random類也不綁定到任何特定算法。 同樣,不同的JVM對於相同的種子值可能會產生不同的序列。 另外,該實現很可能不會與標准C函數綁定在一起。 這意味着,Java生成的序列將與使用相同種子的C序列不同。

如果您確實需要在Java中生成隨機序列以與標准C函數的序列完全匹配,那么您最好希望做的就是針對特定環境復制該序列。 這將需要創建一個JNI庫以代理對srand()和rand()的調用,或者創建一些進行該調用並從Java調用的其他外部進程。 無論哪種方式,這都是很多復雜性和更多程序維護。

如果實際上您需要的只是看起來均勻分布的隨機序列,而不管其確切值如何,請照原樣使用Random。 它足以滿足大多數RNG需求。

如在其他答案中所述,C標准甚至沒有指定rand()將在不同的C平台(庫)之間返回相同的序列,同樣,Java中沒有任何東西可以保證它與任何給定的C(或其他Java)實現相匹配。 您可以使用JNI在該平台上調用特定的C實現,但這只能保證當C和Java程序都在同一平台上使用相同的C庫運行時,產生相同的序列。

如果希望在所有情況下都確保相同的順序,則需要使用兩種語言實現相同的隨機數生成器。 可以在POSIX.1-2001中找到一個簡單的示例,並在許多man 3 rand頁上引用了該示例:

static unsigned long next = 1;

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

void mysrand(unsigned seed) {
    next = seed;
}

它可以輕松移植到Java。 生成器產生的隨機性不是很高,但是也不能保證使用rand()會更好,因此,如果需要更好的隨機性,則需要實現一些奇特的東西。

在C和Java中,相同的種子將生成相同的隨機值。 盡管底層機制可能有所不同,但是我所知道的每種編程語言均會維護此屬性。

給定種子,C和Java可能不會生成相同的隨機數集。 唯一保留的屬性是給定種子,編程語言將生成相同的隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM