加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何生成与比例无关的随机浮点数?

发布时间:2020-12-20 13:35:39 所属栏目:Python 来源:网络整理
导读:我想生成我选择称之为“任意”正浮点数的东西;也就是说,随机数与尺度无关(换句话说,是对数均匀分布的数字).我不是一个数学家,所以我知道我可能会有另一个名字. 这是我最初的,天真的解决方案: import sysimport randomdef arbitrary(min=sys.float_info.min_
我想生成我选择称之为“任意”正浮点数的东西;也就是说,随机数与尺度无关(换句话说,是对数均匀分布的数字).我不是一个数学家,所以我知道我可能会有另一个名字.

这是我最初的,天真的解决方案:

import sys
import random

def arbitrary(min=sys.float_info.min_10_exp,max=sys.float_info.max_10_exp):
    return 10 ** random.uniform(min,max)

令我感到震惊的是,这可能并不理想:首先,我认为random.uniform()的有限精度与浮点表示本身之间可能存在一些相互作用,这会导致预期输出中的聚束和间隙更高数量级.

有更好的方法吗?仅生成一串随机位然后将其转换为它们所代表的浮点数会更有意义吗?

编辑:正如Oli Charlesworth在评论中所指出的那样,“将随机位转换为浮点数”的想法并没有达到我想要的效果(这是log(n)的均匀分布).

解决方法

你是正确的,你的方法不会返回一些数字.例如,1.0和1.0000000000000002之间没有浮点数,但10 ** 1.0000000000000002是10.000000000000005,并且10.0和10.000000000000005之间有两个数字:10.000000000000002和10.000000000000004.算法永远不会返回这两个数字.

但你可以作弊并使用Decimal以更高的精度取幂:

>>> float(10 ** Decimal('1'))
10.0
>>> float(10 ** Decimal('1.0000000000000001'))
10.000000000000002
>>> float(10 ** Decimal('1.00000000000000015'))
10.000000000000004
>>> float(10 ** Decimal('1.0000000000000002'))
10.000000000000005

因此,任意需要生成足够精度的随机Decimal指数并将它们用作指数.假设64个二进制数字对于指数是足够的精度,代码将如下所示:

import sys,random
from decimal import Decimal

def _random_decimal(minval,maxval,added_prec):
    # generate a Decimal in the range [minval,maxval) with the
    # precision of additional ADDED_PREC binary digits
    rangelen = maxval - minval
    denom = rangelen << added_prec
    return minval + Decimal(rangelen) * random.randrange(denom) / denom

def arbitrary():
    min_exp = sys.float_info.min_exp - sys.float_info.mant_dig
    max_exp = sys.float_info.max_exp
    return float(2 ** _random_decimal(min_exp,max_exp,64))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读