在范围之间生成随机浮点数组

我还没有能够找到一个函数来生成一个数组的随机浮动的给定长度之间的一定范围。

我已经看过 随机抽样了,但似乎没有功能能够满足我的需要。

统一 很接近,但它只返回一个元素,而不是一个特定的数字。

这就是我想要的:

ran_floats = some_function(low=0.5, high=13.3, size=50)

它将返回一个包含50个随机非唯一浮点数(即: 允许重复)的数组,这些浮点数均匀分布在 [0.5, 13.3]范围内。

有这种功能吗?

253191 次浏览

为什么不用列表内涵?

在 Python 2中

ran_floats = [random.uniform(low,high) for _ in xrange(size)]

在 Python 3中,range的工作方式类似于 xrange(裁判)

ran_floats = [random.uniform(low,high) for _ in range(size)]

为什么不把 ABc0和列表内涵结合起来呢?

>>> def random_floats(low, high, size):
...    return [random.uniform(low, high) for _ in xrange(size)]
...
>>> random_floats(0.5, 2.8, 5)
[2.366910411506704, 1.878800401620107, 1.0145196974227986, 2.332600336488709, 1.945869474662082]

可能已经有一个函数可以完成您所寻找的任务,但是我还不知道(还不知道?)。 与此同时,我建议使用:

ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5

这将产生一个形状(50)的数组,其均匀分布在0.5和13.3之间。

你也可以定义一个函数:

def random_uniform_range(shape=[1,],low=0,high=1):
"""
Random uniform range


Produces a random uniform distribution of specified shape, with arbitrary max and
min values. Default shape is [1], and default range is [0,1].
"""
return numpy.random.rand(shape) * (high - min) + min

编辑 : 嗯,是的,所以我错过了它,这里有 numpy.Random. univer() ,它具有与您想要的完全相同的调用! 请尝试 import numpy; help(numpy.random.uniform)获取更多信息。

np.random.uniform 适合您的用例:

sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))

2019年10月更新:

虽然语法仍然受到支持,但 API 似乎随着 NumPy 1.17发生了改变,以支持对随机数生成器的更大控制。展望未来,API 已经发生了变化,您应该看看 https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

增强方案在这里: https://numpy.org/neps/nep-0019-rng-policy.html

这是最简单的方法

np.random.uniform(start,stop,(rows,columns))

列表内涵中的 for 循环需要时间,而且速度很慢。 最好使用 numpy 参数(低、高、大小等)

import numpy as np
import time
rang = 10000
tic = time.time()
for i in range(rang):
sampl = np.random.uniform(low=0, high=2, size=(182))
print("it took: ", time.time() - tic)


tic = time.time()
for i in range(rang):
ran_floats = [np.random.uniform(0,2) for _ in range(182)]
print("it took: ", time.time() - tic)

样本输出:

(‘ it took:’,0.06406784057617188)

(‘ it took:’,1.7253198623657227)

或者,您可以使用 SciPy

from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)

为了记录样本整数,它是

stats.randint(10, 20).rvs(50)

np.random.random_sample(size)将在半开区间内生成随机浮点数[0.0,1.0]。

或者,如果您可以使用实数列表,您可以使用标准的 random.randrange:

def some_function(low, high, size):
low_int = int(low * 1000)
high_int = int(high *1000)
return [random.randrange(low_int, high_int, size)/1000 for _ in range(size)]

这应该适合您的示例

sample = (np.random.random([50, ]) * 13.3) - 0.5