【发布时间】:2015-03-26 14:40:06
【问题描述】:
我正在尝试生成浮点数,但不在 [0-1) 内,而是在 sys.float_info.max 和 sys.float_info.min 内。不幸的是,Python 的 random 和 Numpy random 以这种方式工作
a + (b-a) * random()
但是 random() 不会生成足够小的数字来与 MAX 浮点数的指数竞争。
print min([random.uniform(0, sys.float_info.max) for i in range(10000)])
>>2.0237842876e+304
如何生成从 0 - MAX(float) 或 MIN(float) 到 MAX(float) 的浮点数?
【问题讨论】:
-
分发有什么要求?
-
均匀分布,如代码中。
-
我想你误解了均匀分布。回想一下,1E+304 和
sys.float_info.max(2E+308) 之间的数字比 0 和 1E+304 之间的数字多约 20,000 个。即因为您选择 0 到 2E+308 之间的 10k 个数字,所以最小值可能在 2E+304 左右。 -
如果实际上不需要制服,可以使用一些技巧。正如@farenorth 所指出的,在整个范围内对均匀分布进行采样很少会产生适中的值。
-
另请注意,
sys.float_info.min是 2.22E-308(即非常接近 0),而不是- sys.float_info.max。换句话说,random.uniform(sys.float_info.min, sys.float_info.max)和random.uniform(0, sys.float_info.max)应该给出几乎相同的结果。
标签: python numpy random floating-point