生成随机双整数

时间:2014-10-14 12:47:05

标签: java prng

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

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

分发

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

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

2 个答案:

答案 0 :(得分:2)

鉴于双精度是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位。我认为提供统一分布的答案非常棘手

答案 1 :(得分:0)

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

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

  • 在0和Double.MAX_VALUE(here)之间生成一个随机BigInteger
  • 申请doubleValue()

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

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