随机生成int64和float64数字
我正在尝试使用Numpy生成随机的64位整数值,包括整数和浮点数,希望这些值能覆盖该类型的所有有效范围。要生成随机的32位浮点数,我可以使用:
In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10)
Out[2]:
array([ 1.47351436e+37, 9.93620693e+37, 2.22893053e+38,
-3.33828977e+38, 1.08247781e+37, -8.37481260e+37,
2.64176554e+38, -2.72207226e+37, 2.54790459e+38,
-2.47883866e+38])
但是如果我尝试用这个来生成64位数字,我会得到
In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10)
Out[3]: array([ Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf])
同样,对于整数,我可以成功生成随机的32位整数:
In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10)
Out[4]:
array([-1506183689, 662982379, -1616890435, -1519456789, 1489753527,
-604311122, 2034533014, 449680073, -444302414, -1924170329])
但是对于64位整数,我却没有成功:
In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
/Users/tom/tmp/<ipython console> in <module>()
/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)()
/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)()
OverflowError: long int too large to convert to int
这是正常现象吗?还是我应该把这些当作Numpy的bug来报告?
5 个回答
1
我觉得这不是在说随机种子的调用。让我给你看看我写的最简单的代码,它会出现“Python 整数太大,无法转换为 C 的长整型”的错误:
x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64)
这里的 numpy 版本是 1.5.0
2
看起来,numpy.random.uniform()
这个代码在某个地方进行了高低值的计算,而出现的无穷大(Inf)就是从这里来的。
生成均匀分布的整数比较简单,之前已经展示过了。而生成均匀分布的小数就需要更仔细的考虑了。
至于把这些奇怪的情况报告为bug,我觉得你可以选择这样做,或者发个消息到项目的邮件列表。这样你至少能知道开发者认为什么是合理的行为。
7
对于整数,你可以生成两个32位的随机数,然后把它们组合起来:
a + (b << 32)