总结一python 中会遇到的和random相关的函数, 避免在使用过程中总是需要去help(func)一下才确定使用哪个random相关的函数.
python里面目前使用下来使用频率最高的和random有关的两个包是内置的random
包和numpy.random
包(后面称np.random), 下面将两个包里面的random有关函数小结一下.
random.choice(seq)
从一个非空
的序列中返回一个元素, 空序列或者是调用函数不传递参数都会抛出异常.
>>> random.choice([1,2,3])
1
>>>
random.choices((population, weights=None, *, cum_weights=None, k=1))
从一个序列里面有放回
的选择k个元素返回作为子序列, 这个函数关注的应该是population和k这两个参数,虽然可以设置weights权重影响返回的元素,但是一半不设置权重,让元素等概率被抽取,同样population不可为空序列,返回元素数量k取值比较灵活,可以取值大于实际的序列的长度:
>>> random.choices([1,2], k=5)
[2, 2, 1, 1, 1]
>>>
random.randint(a, b): 在a到b这个闭区间([a,b]包含上界限b)
之间返回一个随机整数,要求b>=a
不满足条件就会抛出异常
>>> random.randint(1, 3)
1
>>>
random.randrange(start, stop=None, step=1) 在range(a, b, step)产生的序列里面随机返回一个整数,此方法比randint更合适的产生随机整数的方法,一般从某个范围生成整数都比较喜欢使用半开区间[a,b)
>>> random.randrange(0,9)
8
>>>
random.random() 在0到1半开区间([0,1)不包含上界限1)
之间返回一个随机浮点数
, 扩展一下一般使用这个函数来产生半开区间[a,b)
内的随机浮点数,使用公式 a + (b-a)*random.random()
实现,比如在[10, 20)
之间产生一个随机浮点数
>>> 10 + (20-10)*random.random()
13.523376397364451
>>>
random.sample(population, k, *, counts=None) 从序列中无放回
抽取k个元素作为子序列返回, 这个函数对应的就是random.choices
, 一个是无放回,一个是有放回. 由于是无放回一次性抽取k个元素,如果counts参数不给定,k取值就不能大于
序列的长度
>>> random.sample([1,2,2,3], k=3)
[1, 2, 2]
random.uniform(a, b)在a和b半开区间[a,b)或者闭区间[a,b]
之间返回一个随机的浮点数.其实更推荐使用random.random()来实现这个功能.因为random.random()开闭区间更明确
>>> random.uniform(1, 3)
1.8508710709617202
总之built-in random 包中的函数主要是用于产生单个
随机数.
半开区间[0,1)之间
,满足均匀分布. 如果不给定任何维度的size,将返回一个随机浮点数(标量)>>> np.random.rand()
0.799527976262084
>>> np.random.rand(1,1)
array([[0.41607688]])
>>>
>>> np.random.randn()
-0.010951782519062663
>>> np.random.randn(1,2)
array([[0.21191882, 0.66110974]])
>>>
上面两个方法的参数和其他np.random的方法不太一致. 个人喜欢风格一致的方法.
np.random.randint(low, high=None, size=None, dtype=int) 产生半开区间[low, high)
或者[0, low)
且大小为size的随机向量,取值满足离散均匀分布,特殊情况当size不取值产生一个随机数(标量)
>>> np.random.randint(0,2)
1
>>> np.random.randint(0,2,size=(1,))
array([0])
>>> np.random.randint(0,2,size=(1,1))
array([[0]])
>>>
np.random.random_integers(low, high=None, size=None) 相比于randint它是在闭区间[low,high]
或者[1, low]
之间生成随机向量, 一般情况下更推荐使用np.random.randint
替代.
>>> np.random.random_integers(0, 1, size=(1,1))
<stdin>:1: DeprecationWarning: This function is deprecated. Please call randint(0, 1 + 1) instead
array([[0]])
>>>
np.random.random(size=None) 与random_sample, sample函数功能一样,用于产生size大小的元素大小在半开区间[0.0,1.0)
且满足连续均匀分布的随机向量.此函数就是np.random.rand的替代.同样不给定size产生的是一个随机数(标量).
同样如果要产生[a, b)
的向量使用公式a+(b-a)*np.random.random(size)
>>> np.random.random()
0.05726135361470974
>>> np.random.random(size=(2,2))
array([[0.92446355, 0.56362794],
[0.77883471, 0.61553584]])
>>>
np.random.standard_normal(size=None) 产生size大小的元素满足标准正太分布的向量,同样不给size则是产生一个随机数(标量).此方法就是np.random.randn的替代
>>> np.random.standard_normal()
-0.9319959582235448
>>> np.random.standard_normal(size=(1,2))
array([[0.43686794, 0.75221683]])
>>>
np.random.uniform(low=0.0, high=1.0, size=None) 产生在半开区间[low,high)
内size大小,且元素满足均匀分布的向量.同样size取值就是生成一个随机数(标量).这个函数可以使用np.random.random()
替代.
>>> np.random.uniform(0, 2)
0.37195722847791246
>>> np.random.uniform(0,2,size=(1,2))
array([[0.6067729 , 1.46925238]])
>>>
如果产生单个随机数使用built-in random
包,如果需要产生随机的向量使用np.random
.