Java中的C的stdlib rand()函数

mar*_*ark 1 c java random std

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

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

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

Bre*_*den 6

C标准没有规定srand()和rand()的实现.因此,不同的环境(OS,C库,体系结构等)将很可能产生对于相同种子值不同的数字序列.

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

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

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