【问题标题】:How do you generate a random double between these points?您如何在这些点之间生成随机双精度数?
【发布时间】:2011-05-02 07:46:06
【问题描述】:
37.807614 to 37.786996 

随机生成的 double 必须具有与上述相同的精度(位数)。

例如,37.792242 是好的,而 37.7823423425 是坏的。

【问题讨论】:

  • @TIMEX:什么是最好的-问题通常是主观的(我相信你在发帖时会收到警告)。例如,您可以向我们展示您拥有的东西并告诉我们您不喜欢它的哪些方面。然后我们可以给出具体的建议。
  • 这实际上没有意义;例如,37.807614的实际值更接近37.7922420000000016671037883;它只是被格式化程序四舍五入。您在十进制中看到的位数实际上不是底层双精度的属性。
  • 确实如此。对于给定的范围,所有双精度数完全相同。该范围是[32.0, 64.0) 的子范围。

标签: python types double int


【解决方案1】:

不确定我是否遗漏了一些东西,但为了避免四舍五入,并且由于您想要准确的精度,以整数工作然后通过除法转换为浮点不是最容易的吗?即

offset = float(random.randint(0,20618)) num = (offset + 37786996.0) / 1000000.0

【讨论】:

  • 为什么是 20,618?为什么是 37786996?
  • 因为 20618 是 OP 想要介于其之间的两个浮点数之间的差,而 37786996 / 100000 是 OP 想要介于其之间的数字范围的下限。
【解决方案2】:
round(random.uniform(num1, num2), 6)

由于 IEEE 754 不准确,您偶尔会收到以 ...0001...9999 左右结尾的数字。

【讨论】:

  • 请记住,此问题受docs.python.org/tutorial/floatingpoint.html?highlight=truncate中所述的浮点算术问题的影响
  • 这会使边界处的舍入错误,导致结果有偏差。 round(random.uniform(0, 0.000010), 6)` 将给出 0.000000 和 0.000010 之间的每个值的频率的一半;舍入为 0,[0,0.5) 的值范围是舍入为 0.000001,[0.0000005,0.0000015) 的值范围的一半。
  • @Glenn:那么每个端点需要添加的校正因子是多少?
  • 我不想对其进行抽样测试以确定,但可能是 (.1**6)/2,其中 6 是精度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2018-11-27
  • 2011-02-11
  • 2012-05-16
  • 2014-02-13
  • 2016-01-08
相关资源
最近更新 更多