首页 > 解决方案 > 如何在Java中实现C的drand48和srand48?

问题描述

我需要为用 Java 编写的编程项目实现 Cdrand48()srand48()随机数生成器和初始化程序。程序需要在给定特定种子的情况下模拟从 C 中的这些函数生成伪随机数。

根据手册页:

所有函数通过根据线性同余公式生成一个 48 位整数序列 Xi 来工作:

Xn+1 = (aXn + c) mod m, where n >= 0

参数 m = 2^48,因此执行 48 位整数运算。除非调用 lcong48(),否则 a 和 c 由下式给出:

a = 0x5DEECE66D
c = 0xB

在下面的这个srand48()实现中,我将 Xi 的高 32 位设置为参数 seedval。根据手册页,低 16 位设置为任意值0x330E。我不明白如何应用同余公式来提取随机数。任何帮助将不胜感激,谢谢!

public void srand48(long seedval) {
  this.seed = seedval & 0xFFFFFFFF;
  this.seed = (this.seed << 16) | 0x330E;
}

public double drand48() {
  this.seed = (0x5DEECE66DL * this.seed + 0xBL) & ((1L << 48) - 1);
  return this.seed;
}

调用时出现的数字drand48()超出范围 [0.0, 1.0)。有人还可以解释为什么 48 位对于这种伪随机数的生成如此重要吗?

标签: javacrandom

解决方案


您的实现看起来不错。您获得的值超出范围,因为您this.seed直接返回。您应该首先将结果标准化为 0.0 和 1.0 之间,然后将其返回。另外,请确保this.seedlong.

正确的代码是:

public double drand48() {
    this.seed = (0x5DEECE66DL * this.seed + 0xBL) & ((1L << 48) - 1);
    return (double)this.seed / (1L << 48);
}

推荐阅读