Python常用模块之random

python自带的有random模块,而numpy中也有random的相关功能,因此为了不造成混淆,在载入random模块的时候我们可以给它起一个别名:

import random as rnd
import numpy as np

接下来我们按照功能的逻辑作为顺序,对比着来分析python自带的random模块,和numpy模块中的random之间的异同:

  1. 生成0-9之间的一个随机整数:


rnd0 = np.random.randint(10)
rnd1 = rnd.randint(0, 9) 
rnd2 = rnd.randrange(9)
rnd3 = rnd.randrange(0, 9, 1)

rnd.randint(m, n)的取值范围是[m, n],可生成m-n之间的整数,必须传入左右区间两个参数,只给一个参数会报错。

rnd.randrange(n)方法可以生成一个0-n上的随机整数。可以只传入一个参数为右区间即生成[0, n)之间的随机整数,也可以传入三个参数:左区间,右区间,步长。

而numpy中的 np.random.randint(n)的取值范围是[0, n)。

  1. 随机取5-9之间的三个整数:


rnd2 = np.random.randint(5, 10, 3)
rnd3 = np.random.randint(5, 10, (1, 3))

产生一个多维的数据,python自带的random模块是做不到的。因此我们要选用np.random.randint方法,它需要传入三个数据,左区间,右区间,以及一个描述形状的数值或元组。

rnd2是一个np.array数组。rnd2和rnd3之间的区别是rnd2产生的是一个三维列向量,而rnd3产生的是一个三维行向量。

我们也可以注意到,np.random产生的多维随机数都是np.array类型的,而自带的random模块的多位随机数都是list类型的。

  1. 生成一个0-1的随机浮点数:


rnd4 = rnd.random()
rnd5 = np.random.rand()
rnd6 = rnd.uniform(0, 1)
rnd7 = np.random.uniform(0, 1)

自带的random模块不需要任何参数,np.random.rand方法也不需要任何参数。而numpy中的random.uniform需要给定区间,rnd.uniform方法也需要设定区间范围。

  1. 生成一个1-9的随机浮点数:


rnd8 = np.random.uniform(9)
#rnd8 = np.random.uniform(1)
rnd9 = np.random.rand(1, 9)
rnd10 = rnd.uniform(1, 9)

np.random.uniform默认的左区间为1,只需给uniform一个参数9即可生成1-9之间的浮点数。因为默认左区间的存在,因此rnd8能且仅能产生一个1.0的浮点数。

rnd.uniform(m, n)可生成m-n之间的浮点数,必须传入左右区间两个参数,只给一个参数会报错。

  1. 生成一个2*3的数组,里面装着6个0-1之间的浮点数:


pythonrnd7 = np.random.uniform(0, 1, (2, 3))
rnd8 = np.random.random_sample((2, 3))

上面的两种说法等价,np.random.random_sample可以生成0-1之间的浮点数,只需给出一个描述生成的数组形状的tuple格式的数据。

而np.random.uniform方法需要传入三个数据,左区间,右区间,以及一个描述形状的元组.

  1. 生成一个符合高斯分布的随机数,和一个符合正态分布的随机数:


rnd = rnd.gauss(1, .2)
rnd = rnd.normalvariate(1, 0.2)

将返回一个符合要求的浮点数,其中两个参数一个是mu,另一个是sigma。

  1. 随机选择可迭代对象的6个元素(可重复选择),如果可能的话,将它们排列成2*3的矩阵:

str1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

rnd = np.random.choice(list1, 6)
rnd = np.random.choice(list1, (2, 3))
#rnd = np.random.choice(str1, 6)
rnd = rnd.choices(list1, 6)
rnd = rnd.choices(str1, 6)
rnd = rnd.sample(str1, 6)

np.random.choice方法可以从列表中挑选n个元素(最好是数字),然后依据传入的第二个参数进行排列组合,如果是个tuple就将tuple内的数据作为维数。

记住,自带的random模块中的方法,除了sample,和choices能返回多个随机数外,其他的都只能返回一个随机数。但凡自带的random模块返回的多个数据,格式都是list。但凡np.random中的方法返回的多个数据都是np.array类型的,而且默认的是一维列向量。

而numpy作为一个数据处理的模块,他的np.random.choice方法无法处理字符串。而rnd.choice方法的参数只要是Iterable的即可,可以是str,也可以是list。

  1. 对数据进行原地随机排列:


list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
list2 = ['Spring', 'Breeze', 'Ten', 'Miles']
arr1 = np.arange(16).reshape(4, 4)  #生成一个4*4的矩阵
tuple1 = tuple(list1)
frozenset1 = frozenset(list1)

np.random.shuffle(list1)
np.random.shuffle(arr1)
rnd.shuffle(list1)
#rnd.shuffle(tuple1)
#rnd.shuffle(frozenset1)

对于可变的数据类型,比如list,而对于静态不可变的数据,比如str, frozenset, tuple等,都不能使用shuffle方法。

而numpy中的np.random.shuffle方法不仅可以处理list,还能对np.array类型的数据进行重新排列,但是要注意的是,只能打乱矩阵的行的次序,而保持每一行中的数据的相对位置。

  1. 对数据进行原地随机排列,并且不改变原来数据:


rnd = rnd.sample(tuple1, len(tuple1))
rnd = rnd.sample(frozenset1, len(frozenset1))
rnd = np.random.permutation(list2)
arr = np.random.permutation(arr1)

自带的rnd.sample方法可以对静态的数据进行重排,返回一个列表。原理是从可迭代对象中挑选出(不重复的)k个对象进行重拍。返回排列之后的列表,而不改变原来的数据。

np.random.permutation是专门进行打乱顺序的函数,与np.random.shuffle方法对应。

我们可以从中体会到numpy与众不同的地方!

多维数组即为矩阵!生成随机数的时候可以指定数组的形状,而python自带的列表,即使是多维列表也不能按照矩阵来理解,当然也就不能像矩阵一样指定形状!

numpy主要用来进行数据计算,而不擅长处理字符串,需要对字符串进行操作最好还是选用python自带的方法或函数。

举个小例子,生成一个由A-Z, a-z, 或0-9组成的四位验证码:

vericode = ''
for i in range(4):
    rnd_veri = rnd.randint(0, 2)
    if rnd_veri == 0:
        vericode += str(rnd.randint(0, 9))
    elif rnd_veri == 1:
        vericode += chr(rnd.randint(65, 90))
    elif rnd_veri == 2:
        vericode += chr(rnd.randint(97, 122))

利用chr函数将ascii码转换成一个字符(串),(65, 90)是大写的A-Z,(97, 122)是小写的a-z。字符串之间可以用+将进行连接,要把vericode初始化为str类型,但不放入内容。

猜你喜欢

转载自blog.csdn.net/lau_sen/article/details/80601910