我试图生成浮点数,但不在[0-1]范围内,而是sys.float_info.max
和sys.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(浮点)生成浮点数?
答案 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.min
和sys.float_info.max
为int64
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)
然后,我们可以在imin
和imax
之间生成随机整数,并将其视为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之间有更多,并且远远超过它
在大花车之间。因此,下面的方法不会产生
来自统一分布的随机样本。