Java中的C的stdlib rand()函数

时间:2012-02-08 23:55:36

标签: java c random std

我使用来自stdlib的srand()rand()从C中的已知种子生成了一系列随机数。我现在需要使用Java中的C语言生成相同的数字序列。

Java的Random类文档声明它使用“线性同余公式”。我在rand()上找到的文档说它使用了“线性同余”生成器,虽然我不确定这是否适用于一个特定的实现。

如果给定相同的种子,或者如果Java存在srand()rand()的端口,是否有人知道这两个生成器是否会生成相同的数字?

3 个答案:

答案 0 :(得分:6)

C标准没有规定srand()和rand()的实现。因此,不同的环境(操作系统,C库,体系结构等)很可能会生成相同种子值不同的数字序列。

此外,Java的Random类的实现不受任何特定算法的约束。同样,不同的JVM可以很好地为相同的种子值产生不同的序列。此外,实现很可能不会与标准C函数相关联。这意味着,Java生成的序列将与使用相同种子的C序列不同。

如果您真的需要在Java中生成随机序列以完全匹配标准C函数,那么您希望做的最好的事情就是复制特定环境的序列。这需要创建一个JNI库来代理对srand()和rand()的调用,或者创建一些其他外部进程来进行调用并从Java调用。无论哪种方式,这都是一个复杂性和更多的程序维护。

如果实际上你需要的是看似均匀分布的随机序列,无论确切的值如何,那么按原样使用Random。对于大多数RNG需求来说,这已经足够了。

答案 1 :(得分:1)

正如在其他答案中所说,C标准甚至没有指定rand()将在不同的C平台(库)上返回相同的序列,同样Java中没有任何内容保证它匹配任何给定的C(或其他Java)实现。您可以使用JNI在该平台上调用特定的C实现,但这只能保证在使用相同的C库在同一平台上运行C和Java程序时生成相同的序列。

如果您希望在所有情况下确保相同的顺序,则需要在两种语言中实现相同的随机数生成器。一个简单的例子可以在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()也不能保证更好,所以如果需要更好的随机性,你需要实现更好的东西。

答案 2 :(得分:0)

在C和Java中,相同的种子将生成相同的随机值。虽然底层机制可能不同,但我所知道的每种编程语言都保留了这个属性。

C和Java可能不会在给定种子的情况下生成相同的随机数集。维护的唯一属性是给定种子,编程语言将生成相同的随机数。