python - 如何生成与标度无关的随机 float ?

标签 python random floating-point distribution

我想生成我选择称之为“任意”正 float 的东西;也就是说,与尺度无关的随机数(换句话说,其对数均匀分布的数字)。我算不上数学家,所以据我所知,我所追求的可能有另一个名称。

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

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() 的有限精度与浮点表示本身之间可能存在某种相互作用在更高的数量级导致预期输出中的聚束和间隙。

有更好的方法吗? 只生成一串随机位然后将其转换为它们表示的 float 是否更有意义?

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

最佳答案

您是正确的,您的方法没有返回一些数字。例如,1.01.0000000000000002之间没有 float ,但是10**1.000000000000000210.000000000000005 , 10.010.000000000000005 之间有两个数字:10.00000000000000210.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))

关于python - 如何生成与标度无关的随机 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17506729/

相关文章:

python - 打开 .ipynb.txt 文件

Javascript:如何随机改变背景?

c - 4字节(32位)的IEEE 754算术

math - 当我在 clojure 中除以数字时,我得到一个分数,如何得到小数?

javascript - 您能否生成一个用与 Python 或 PHP 服务器不同的语言编写的子进程,就像使用 Node.js 一样?

python - OpenCV + Python-NameError:名称 'imSize'未定义

c - 在C中生成从-n到n的随机数

c - 如何使用 GMP 获取 C 中定义的实型数字的字节计数部分

python - 对递归函数感到困惑

language-agnostic - 随机排序数组