java - 如何在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 位对于这种伪随机数的生成如此重要吗?
解决方案
您的实现看起来不错。您获得的值超出范围,因为您this.seed
直接返回。您应该首先将结果标准化为 0.0 和 1.0 之间,然后将其返回。另外,请确保this.seed
是long
.
正确的代码是:
public double drand48() {
this.seed = (0x5DEECE66DL * this.seed + 0xBL) & ((1L << 48) - 1);
return (double)this.seed / (1L << 48);
}
推荐阅读
- validation - 即使在角度 6 的字段中输入值,反应形式也无效
- javascript - Javascript:如何将变量存储在构造函数中的空变量中
- linux - 在命令中用“:”替换空格
- c# - 使用 c# 编码为 CID 时从电子邮件中检索和显示内联图像
- kotlin - 从 kotlin/native 框架快速调用类
- c# - c# 创建 HTTP POST 网络请求
- javascript - npm 错误!意外的令牌 < 在 JSON 中的位置 0 解析时靠近 '
- typeorm - Typeorm 子查询添加选择
- maven - 创建汇总报告结合所有 Jtl 文件
- c# - C#:等到命令完全执行