【问题标题】:Can I draw a random value from uniform distribution on an open interval?我可以从开区间上的均匀分布中抽取一个随机值吗?
【发布时间】:2020-02-12 17:09:21
【问题描述】:

我想使用 numpy 从开放范围 (0,5) 的连续均匀分布中提取随机值。我的目光落在了 numpy.random.uniform(0,5) 上。但是,根据文档和一些帖子,这包括闭区间 [0,5] 或半开区间 [0,5)。

我看了很多帖子,到目前为止还没有找到好的答案。到目前为止的答案包括:您不需要使用完全开放的范围,因为绘制起始值和结束值几乎是不可能的(仅在理论上),或者关于它实际上是半开放还是完全封闭存在争议。到目前为止我想到的最好的解决方案是:

import numpy as np
rn = np.random.uniform(sys.float_info.epsilon, 5-sys.float_info.epsilon)
print(rn)

或者使用numpy的next_after:

import numpy as np
rn = np.random.uniform(np.nextafter(0,1), np.nextafter(5,0))
print(rn)

显然,如果我没有很好的理由(理论上)从完全开放的范围中抽牌,我不会打扰每个人。我真的很感激关于如何合理地争论我正在从完全开放的区间 (0,5) 上的连续均匀分布中抽取随机值的想法。

提前致谢!

【问题讨论】:

  • 您能否详细说明获取0.0 会给您带来哪些问题?您提出的第二个解决方案包括最小的可表示有限正数(大约5e-324)作为潜在输出,在许多实际情况下,我希望这与0.0 一样有问题。 (顺便说一句,您不需要np.nextafter(5, 0)5 在这里就足够了;构造输出的方式意味着5.0 不是可能的输出。对于您的第一个解决方案,5 - sys.float_info.epsilon 没有什么不同来自5。)
  • 我需要从一个完全开放的区间中绘制的主要原因是因为我正在复制一个人类参与者的实验。在这个实验中,一个随机变量是从一个开区间中抽取的。此外,在我的领域中,不对参与者撒谎是很常见的。因此,我必须找到一种方法来做到这一点。感谢您的建议。

标签: python numpy random uniform


【解决方案1】:

如果检查rn == 0并拒绝它呢?

rn = np.random.uniform(5)
while rn == 0.0:
   rn = np.random.uniform(5)

【讨论】:

  • 感谢您的解决方案。我想我会使用它。 rn == 5.0 不需要签到吗?
  • 没有必要排除 5,因为根据 np.random.uniform 的文档,“样本在半开区间 [low, high) 上均匀分布(包括低,但不包括高) "
  • @AndreasK。该文件具有误导性。见github.com/numpy/numpy/issues/10803。 (在这种情况下,5.0 确实无法生成的,但原因比high 总是被排除在外更微妙一些。)
  • 确实你是对的。我认为即使在这种情况下也可以生成 5.0,因为4.9999999999999999 == 5 是 True。但这种可能性非常低。所以是的,我认为你也可以排除它以完全确定。
  • 因此,如果 IEEE 754 binary64 浮点正在使用中(几乎可以肯定是这样),并且舍入模式是默认的舍入到偶数舍入模式(这又很可能) ,则无法生成5.0,本质上是因为5.0 * (1 - 2**-53)5.0 向下舍入到下一个浮点数。 (相关:stackoverflow.com/q/3037952/270986)但我同意添加额外检查以确保不会有任何危害。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2014-04-19
  • 1970-01-01
相关资源
最近更新 更多