python 中的 random

6 篇文章 0 订阅

背景

总结一python 中会遇到的和random相关的函数, 避免在使用过程中总是需要去help(func)一下才确定使用哪个random相关的函数.

常用random相关函数汇总

python里面目前使用下来使用频率最高的和random有关的两个包是内置的random包和numpy.random包(后面称np.random), 下面将两个包里面的random有关函数小结一下.

built-in 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 包中的函数主要是用于产生单个随机数.

numpy random

  • np.random.rand(d0, d1, d2,…dn) 给定每一个维度的size生成n维的随机向量, 元素取值在半开区间[0,1)之间,满足均匀分布. 如果不给定任何维度的size,将返回一个随机浮点数(标量)
    >>> np.random.rand()
    0.799527976262084
    >>> np.random.rand(1,1)
    array([[0.41607688]])
    >>>
    
  • np.random.randn(d0,d1,d2,…dn) 同rand,此函数也是用于生成n维的随机向量,但是元素是满足标准正太分布(均值为0方差为1).同样如果不给定任何维度size,将返回一个随机浮点数.
    >>> 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.

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值