在可能的MAX和MIN内生成浮点数组

时间:2015-01-27 20:46:39

标签: python numpy random floating-point

我试图生成浮点数,但不在[0-1]范围内,而是sys.float_info.maxsys.float_info.min。不幸的是,Python的随机和Numpy随机工作是这样的

a + (b-a) * random()

但是random()生成的数字不足以与MAX float的指数竞争。

print min([random.uniform(0, sys.float_info.max) for i in range(10000)])
>>2.0237842876e+304

如何从0 - MAX(浮点)或MIN(浮点)到MAX(浮点)生成浮点数?

3 个答案:

答案 0 :(得分:0)

我认为您可以通过连接整数部分和浮点数来简单地生成随机数的两个部分。

random.uniform(sys.float_info.min, sys.float_info.max) + random.random()

答案 1 :(得分:0)

我发现在可能范围内生成任何随机浮点数的最佳方法是生成随机字节序列并将其解析为float。

import os, struct, math
#float32
rand_num = struct.unpack('f', os.urandom(4))[0]
if not math.isnan(rand_num):
  print rand_num

#float64 aka double
rand_num = struct.unpack('d', os.urandom(8))[0]
if not math.isnan(rand_num):
  print rand_num

答案 2 :(得分:0)

我们可以查看花车sys.float_info.minsys.float_info.maxint64 s:

imin = np.float64(sys.float_info.min).view('int64')
imax = np.float64(sys.float_info.max).view('int64')

In [298]: imin, imax
Out[298]: (4503599627370496, 9218868437227405311)

然后,我们可以在iminimax之间生成随机整数,并将其视为float64 s:

In [299]: np.random.random_integers(imin, imax, size=10).view('float64')
Out[299]: 
array([  2.88648634e+084,   3.52929128e+117,   4.92852196e-157,
         1.19367593e+214,   3.72292917e-171,   7.00063144e+121,
         9.06356989e+141,   9.13489394e-054,   1.29622916e-304,
         2.04781344e+064])

随着整数从imin增加到imax,相应的浮点数也会增加 从sys.float_info.min增加到sys.float_info.max

float('inf')float('nan')对应的整数位于[imin, imax]区间之外,因此您无需担心生成inf或{{ 1}} S上。

nan

警告:正如In [323]: np.arange(imax, imax+5).view('float64') Out[323]: array([ 1.79769313e+308, inf, nan, nan, nan]) 指出的那样,可以表示为浮点数的数字不是 平均分配。在0和1之间有更多的浮点数比在1和2之间有更多,并且远远超过它 在大花车之间。因此,下面的方法不会产生 来自统一分布的随机样本。