Python3中常用模块-random模块

本文详细介绍了Python中random模块的功能和使用方法,包括随机数种子设置、生成随机浮点数和整数、从序列中随机选择元素,以及如何生成随机字符串。通过实例展示了如何控制随机数生成过程,适用于需要随机性的各种编程场景。

目录

1:获取模块帮助文档

2:random模块方法

2.1 基本方法

   2.1.1:设置随机种子:  random.seed(a=None, version=2)  

2.1.2:获取及设置生成器的内部状态

2.3 随机浮点数

2.4 从序列中随机获取元素

3:生成随机字符串


random是Python中与随机数相关的模块,其本质就是一个伪随机数生成器,我们可以利用random模块基础生成各种不同的随机数,以及一些基于随机数的操作。

1:获取模块帮助文档

# encoding=gbk
import  random

print(random.__doc__)

print(dir(random))

for item in dir(random):
    print(item)

print(help(random.random))
print(help(random.randrange))
print(help(random.randint))

2:random模块方法

2.1 基本方法

   2.1.1:设置随机种子:  random.seed(a=None, version=2)  

初始化随机数生成器。如果未提供a或者a=None,则使用系统时间为种子。如果a是一个整数,则作为新的种子。如果a的值一样,每次运行的产生的随机数都是一样的。

import  random

random.seed(100)
print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,10000))

"""
每次运行,产生的值都是一样的
"""

2.1.2:获取及设置生成器的内部状态

 获取状态:
state = random.getstate() 
设置状态:
random.setstate(state)

这个有什么用呢?在状态一样的情况下,生成的随机数是一样的,如下例子:
 

import  random

# 保存内部状态
state = random.getstate()

print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,10000))
print(random.randint(1,10000))

print('*'*20)
# 重置内部状态,后面产生的随机数将会与保存state状态的地方产生的随机数一样(当然是随机范围一样的情况下)
random.setstate(state)
print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,1000))
print(random.randint(1,10000))
print(random.randint(1,10000))

"""
输出:
329
724
674
2496
4437
********************
329
724
674
2496
4437
"""

2.2 随机整数

import  random

# 返回一个不大于K位的Python整数(十进制),比如k=10,则结果是0~2^10之间的整数。
k = 10
print(random.getrandbits(k))

# random.randrange(start, stop[, step])
print(random.randrange(10))  # [0,10),0---9  

print(random.randrange(1, 10,2))  # [1,10) ,1---9 中的奇数

# random.randint(a, b)
print(random.randint(1, 10))  # [1,10]  1---10 之间的整数

2.3 随机浮点数

import  random
# [0, 1)
print(random.random())

# uniform(a, b):[a, b) or [a, b] depending on rounding; 四舍五入
print(random.uniform(10.25,100.25))

2.4 从序列中随机获取元素

import  random

# 1:
# 从非空序列seq中随机选取一个元素。如果seq为空则弹出IndexError异常。
# choice(seq) 
seq = [1,2,3,4,5,6,7,8,11]
print(random.choice(seq))


# 2:
# 3.6版本新增。从population集群中随机抽取K次元素。weights是相对权重列表(即可以转换为概率),cum_weights是累计权重,两个参数不能同时存在。
# choices(population, weights=None, *, cum_weights=None, k=1)
a = [1,2,3,4,5]
# 在a中取5次元素,每次都从原序列中取,
print(random.choices(a,k=5)) 
# 在a中取5次元素,每次都从原序列中取,并按照相对权重来取(可以理解按照概率(权重/累计权重)来取),下面输出中:第三个元素的概率是100%
print(random.choices(a,weights=[0,0,1,0,0],k=5))
# 在a中取5次元素,每次都从原序列中取,并按照相对权重来取(可以理解按照概率来取);下面输出中,每个元素取到的概率都是一样的
print(random.choices(a,weights=[1,1,1,1,1],k=5))
# cum_weights是累计权重,如:weights=[1,2,3,4,5] 对应的cum_weights为cum_weights=[1,3,6,10,15],
#  那么 cum_weights=[1,1,1,1,1] 对应的weights为: weights=[1,0,0,0,0],即第一元素取到的概率为100%
print(random.choices(a,cum_weights=[1,1,1,1,1],k=5))
 
"""
结果:
[3, 4, 2, 2, 3]  --- 随机的
[3, 3, 3, 3, 3]  --- 每次都是3
[5, 4, 4, 4, 5]  --- 随机的
[1, 1, 1, 1, 1]  --- 每次都是1

""" 

# 3:
# 从population样本或集合中随机抽取K个不重复的元素形成新的序列。常用于不重复的随机抽样。返回的是一个新的序列,不会破坏原有序列。比如从一个整数区间随机抽取一定数量的整数random.sample(range(10000000), k=60),这非常有效和节省空间。 如果k大于population的长度,则弹出ValueError异常。
a = [1,2,3,4,5]
# 在a中取3次元素,上次取完之后,下次在剩下的元素中取;(注意与random.choices的区别:random.choices是取一次之后,还会在原序列所有元素中取)
# sample(population, k) 
print(random.sample(a, 3))  # [4, 5, 1]  随机的


# 4:
# 随机打乱序列x内元素的排列顺序,俗称“洗牌”。只能用于可变的序列,对于不可变序列。
# shuffle(x, random=None)
a = [1,2,3,4,5]
# 把a的顺序打乱
random.shuffle(a) # 返回值为None
print(a)  # 随机的


 

3:生成随机字符串

# encoding=gbk
import random, string

# string 模块中:
# ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
# ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# ascii_letters = ascii_lowercase + ascii_uppercase
# digits = '0123456789'
# hexdigits = digits + 'abcdef' + 'ABCDEF'
# octdigits = '01234567'
# punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""


# 1:最少4位
# 2:最少包括一位大写字母,小写字母,数字。
def verificationCode(length):
    if length < 4:
        length = 4
    result = ''
    one_lower = [random.choice(string.ascii_lowercase)]
    one_upper = [random.choice(string.ascii_uppercase)]
    one_numeric = [random.choice(string.digits)]

    all_chars = one_lower
    all_chars += one_upper
    all_chars += one_numeric
    length = length - 3
    all_chars += [random.choice(string.ascii_letters + string.digits) for i in range(length)]

    # 洗牌,打乱顺序
    random.shuffle(all_chars)
    # 生成最终字符串
    result = ''.join([i for i in all_chars])
    return result




# 1:最少8位
# 2:最少包括一位大写字母,小写字母,数字,特殊字符。
def genRandomString(length):
    if length < 8:
        length = 8

    result = ''
    one_lower = [random.choice(string.ascii_lowercase)]
    one_upper = [random.choice(string.ascii_uppercase)]
    one_numeric = [random.choice(string.digits)]
    one_punctuation = [random.choice(string.punctuation)]


    all_chars = one_lower
    all_chars += one_upper
    all_chars += one_numeric
    all_chars += one_punctuation
    length = length - 4
    all_chars += [random.choice(string.ascii_letters + string.digits + string.punctuation) for i in range(length)]

    # 洗牌,打乱顺序
    random.shuffle(all_chars)
    # 生成最终字符串
    result = ''.join([i for i in all_chars])
    return result


if __name__ == '__main__':
    print(verificationCode(4))
    print(genRandomString(8))

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值