100天精通Python(基础篇)——第30天:标准库random

Posted 小袁ITSuper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天精通Python(基础篇)——第30天:标准库random相关的知识,希望对你有一定的参考价值。

文章目录

前言

  • 作者介绍:Python领域优质创作者、数据开发工程师
  • 励志成为Python全栈工程师,关注我发现更多精彩~
  • 本文已收录于Python全栈系列专栏:100天精通Python从入门到就业
  • 欢迎订阅,订阅专栏后可私聊进百人Python全栈交流群(手把手教学,问题解答); 还可领取80GPython全栈教程 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!


一、random库介绍

random模块实现了各种分布的伪随机数生成器。为什么称为伪随机数:即人类使用算法等方式,以一个基准(也被叫做种子,最常用的就是时间戳)来构造一系列数字,这些数字的特性符合人们所理解的随机数。但因为是通过算法得到的,所以一旦算法和种子都确定,那么产生的随机数序列也是确定的,所以叫伪随机数。

import random

二、常用函数

random.seed(a)

设置初始化随机种子,可输出相同随机数序列;a取整数或浮点数,不设置时默认以系统时间为种子

import random

print("没有设定种子时")
for i in range(5):
    ret = random.randint(1, 10)
    print(ret, end=" ")
print()

print("设定种子时")
random.seed(1)
for i in range(5):
    ret = random.randint(1, 10)
    print(ret, end=" ")

输出结果:

如上图可以看出:没有显式设定种子时,每次输出的随机数都是不一样的;显式设定种子时,每次输出的随机数都是一样的

random.random()

用于生成一个 0.0 到 1.0 的随机浮点数

>>> import random
>>> random.random()
0.9279749775408933
>>> random.random()
0.12720379394341363
>>> random.random()
0.9391670189485866

random.uniform(a,b)

生成一个[a,b]之间的随机小数;a, b 取整数 或 浮点数

>>> import random
>>> random.uniform(10.0, 20.0)
10.839441969258752
>>> random.uniform(10.0, 20.0)
12.233491150445115
>>> random.uniform(10, 20)
11.290566243261305

random.randint(a,b)

生成一个[a,b]之间的随机整数

>>> import random
>>> random.randint(10,100)
100
>>> random.randint(10,100)
83
>>> random.randint(10,100)
66

random.randrange(start,stop,[step])

生成一个[start,stop)之间以step为步数的随机整数;start,stop,step取整数,step不设时默认值为1

随机生成1-100的整数:

>>> import random
>>> random.randrange(1,100)
54
>>> random.randrange(1,100)
21
>>> random.randrange(1,100)
71

随机生成1-100的奇数:

>>> import random
>>> random.randrange(1,100,2)
37
>>> random.randrange(1,100,2)
63
>>> random.randrange(1,100,2)
29

随机生成1-100的偶数:

>>> import random
>>> random.randrange(2,100,2)
62
>>> random.randrange(2,100,2)
6
>>> random.randrange(2,100,2)
46

random.getrandbits(k)

生成一个占内存k位以内的随机整数;k取长度的整数值

>>> import random
>>> random.getrandbits(10)
29
>>> random.getrandbits(10)
540
>>> random.getrandbits(10)
227

random.choice(seq)

从序列类型seq中随机返回一个元素;seq取序列类型:如字符串,列表,元组

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.choice(list)
'b'
>>> random.choice(list)
'f'
>>> random.choice(list)
'g'

random.shuffle(seq)

将序列类型中元素随机排序,返回打乱后序列,seq被改变(改变原列表),shuffle为洗牌之意; seq取序列类型:如字符串,列表,元组

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.shuffle(list)
>>> list
['c', 'a', 'f', 'd', 'g', 'b']
>>> random.shuffle(list)
>>> list
['f', 'a', 'b', 'c', 'g', 'd']
>>> random.shuffle(list)
>>> list
['a', 'd', 'g', 'c', 'b', 'f']

random.sample(pop,k)

从pop中选取k个元素,以列表类型返回(不改变原列表);pop取序列类型,k取整数:代表选取个数

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.sample(list, 4)
['b', 'f', 'c', 'a']
>>> random.sample(list, 4)
['g', 'f', 'b', 'd']
>>> random.sample(list, 4)
['g', 'f', 'c', 'b']

三、不常用函数

random.getstate()

捕获并返回生成器当前内部状态的对象,可以把它传递给setstate()函数来把生成器内部状态恢复到调用getstate()函数之前的状态。相当于备份。

random.setstate(state)

state应为getstate()函数的结果,用来把生成器当前的内部状态恢复为state。

random.betavariate(alpha, beta)

Beta分布:参数的条件是 alpha > 0 和 beta > 0, 返回值的范围介于 0 和 1 之间。

random.expovariate(lambd)

指数分布

random.gammavariate(alpha, beta)

Gamma分布:参数的条件是 alpha > 0 和 beta > 0

random.gauss(mu, sigma)

高斯分布:mu是平均值,sigma是标准差。

random.normalvariate(mu, sigma)

正态分布:mu是平均值,sigma是标准差。

random.paretovariate(alpha)

帕累托分布:alpha是形状参数。

random.weibullvariate(alpha,beta)

威布尔分布:alpha是比例参数,beta是形状参数。

四、真实案例

随机密码字符串

字符串包括数字和字母, 可以指定密码的位数

import random
import string


def get_random_string(length):
    # 随机生成字母和数字的位数
    num_count = random.randint(1, length - 1)
    letter_count = length - num_count

    # 随机抽样生成数字序列
    num_list = [random.choice(string.digits) for _ in range(num_count)]

    # 随机抽样生成字母序列
    letter_list = [random.choice(string.ascii_letters) for _ in range(letter_count)]

    # 合并字母和数字
    all_list = num_list + letter_list

    # 乱序
    random.shuffle(all_list)

    result = "".join([i for i in all_list])
    return result


# 生成10位的密码
password1 = get_random_string(10)
print(password1)
# 生成15位的密码
password2 = get_random_string(15)
print(password2)
# 生成20位的密码
password3 = get_random_string(20)
print(password3)

输出结果:

41eD76F3e1
915087432k8443z
002L5292840A07284755

计算圆周率

1)圆周率的近似计算公式:

pi = 0
N = 100
for k in range(N):
    pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6))
print("圆周率值是:%s" % pi)

输出结果:

圆周率值是: 3.141592653589793

2)蒙特卡洛算法:

import random

DARTS = 1000 * 1000 * 10
hits = 0.0

for i in range(1, DARTS + 1):
    x, y = random.random(), random.random()
    dist = pow(x ** 2 + y ** 2, 0.5)
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits / DARTS)
print("圆周率值是:%s" % pi)

输出结果:

圆周率值是:3.14205

以上是关于100天精通Python(基础篇)——第30天:标准库random的主要内容,如果未能解决你的问题,请参考以下文章

100天精通Python(基础篇)——第29天:标准库sys

100天精通Python(基础篇)——第31天:三个时间相关标准库

100天精通Python(基础篇)——第28天:标准库os

100天精通Python(基础篇)——第33天:数学相关模块文末送书两本

100天精通Python(进阶篇)——第40天:pymongo操作MongoDB数据库基础+代码实战

100天精通Python丨基础知识篇 —— 03Python基础知识扫盲(第一个Python程序,13个小知识点)