【问题标题】:Generating a random double integer生成随机双整数
【发布时间】:2014-10-14 12:47:04
【问题描述】:

如何从以下集合中选择一个随机数:

  • 可以用双精度浮点数精确表示的所有正整数(即 Java double)。

分布

在我的特定用例中,我不需要均匀分布。然而,我对这样的解决方案在学术上很感兴趣。此外,制服可以(至少)两种不同的方式来解释:

  • 分布在 [0, Double.MAX_VALUE] 中是均匀的。
  • 选择每个可能值的概率相等。

【问题讨论】:

  • 你试过的代码在哪里?
  • 你到底是什么意思?
  • exactly by a double precision floating point number 是什么意思?
  • 为什么所有的反对票?在我看来,这个问题既有趣(如果可能不是很实用)而且足够精确......
  • 投反对票者的自白:编辑了问题,以便我投赞成票。这个问题会困扰我整个下午。

标签: java prng


【解决方案1】:

鉴于双精度是 64 位,您可以生成 8 个字节的随机性并使用 NIO 来获得相应的双精度,我认为这应该提供完整的覆盖范围......但是它不会产生均匀分布。

Random random = new Random();
byte[] buffer = new byte[8];
random.nextBytes(buffer);

System.out.println(Math.abs(Math.round(ByteBuffer.wrap(buffer).getDouble())));

通过查看double 64 binary layout,我一直在提醒自己如何在 Java 中表示双精度数,指数有 11 位,小数有 52 位。我认为提供均匀分布的答案会非常棘手

【讨论】:

  • 我确实想过这样的事情。当然,您需要应用roundabs 使其成为正整数。我认为分布不会很均匀。在我当前的用例中这不是问题,但它伤害了内心的完美主义者:)
  • 如果您研究规范。对于 IEEE 754,您可以将其与我的方法相结合...en.wikipedia.org/wiki/IEEE_floating_point
  • +1 表示结果分布不均匀。
【解决方案2】:

我想到了以下未经测试的方法。

分布在 [0, Double.MAX_VALUE] 中是均匀的。

  • 生成介于 0 和 Double.MAX_VALUE (here) 之间的随机 BigInteger
  • 申请doubleValue()

选择每个可能值的概率相等。

  • 创建一个 64 位的缓冲区。
  • 将符号设为正数。
  • 在 1 到 1023 之间随机设置指数。
  • 用随机位填充其余部分(小数部分)。
  • 如果数字未标准化(例如,它是 200 * 2,其中标准化版本是 400 * 1),请丢弃它并重试。

【讨论】:

    猜你喜欢
    • 2018-10-09
    • 2014-08-22
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多