【问题标题】:Getting closest to endpoints of (1,0) using np.random.uniform使用 np.random.uniform 最接近 (1,0) 的端点
【发布时间】:2018-08-29 22:56:46
【问题描述】:

- 可以在区间 (0, 1] 上绘制随机数,即包括 1 使用:

import numpy as np
r = np.random.uniform(low=0.0, high=1.0, size=10)

但是,我想在区间 (0, 1) 上生成数字,即不包括 1 和 0。类似于:

r = np.random.uniform(low=0.0, high=1.0 - 2**-16, size=10)

有效,但是理论上我可以接近 1 和 0,有没有办法确保我可以接近 1 和 0?

【问题讨论】:

    标签: python numpy-random


    【解决方案1】:

    首先,请注意np.random.uniform[low, high) 上返回均匀分布的随机数,即包括low 但不包括high。所以我假设你想从你的样本中排除0,而不是1

    就您可以实际接近零的程度而言,这受到计算机算术精度的限制。假设 NumPy 使用的 IEEE 浮点数,最接近但大于零的浮点数由下式给出:

    >>> np.nextafter(0.0, 1.0) # Closest to 0.0 in direction of 1.0
    5e-324
    

    所以要在(0, 1) 上生成数字,您可以这样做:

    >>> np.random.uniform(low=np.nextafter(0.0, 1.0), high=1.0, size=10)
    

    【讨论】:

    • 不知道np.nextafter,所以谢谢你告诉我。但是,np.nextafter(0,1) == 1 - np.nextafter(1,0) 的计算结果为 false,这似乎意味着在接近 0 和 1 的距离上存在不对称性?
    • @edager 是的,没错。浮点意味着小数点“浮动”。因此,与固定精度(任何数字的小数点后位数相同)相比,每个数字的精度随其大小而变化。 1000 与下一个最大数之间的差远大于 0 与其下一个数之间的差,这就是为什么存在像 np.nextafter() 这样的函数的原因。我建议reading more about IEEE-754 浮点表示。
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多