当前位置: 首页 > news >正文

python进阶系列 - 11 python随机数


Python中定义了一组用于生成或修改随机数的函数。

本文主要分享python中常用的随机模块:

  • random 模块
  • random.seed() 函数
  • secrets 模块
  • numpy.random 函数

random 模块

这个模块实现了各种分布的伪随机数生成器。 它使用 Mersenne Twister 算法作为其基础生成器。
本质上是一个伪随机数生成器,因为它的数字看起来随机,但是可以重复。

运行下面代码:

import random

a = random.random()  # 取0到1之间的随机浮点数(0.0 <= a < 1.0)
print(a)

a = random.uniform(1, 10)  # 取1到10之间的随机浮点数(1.0 <= a < 10.0 )
print(a)
a = random.randint(1, 10)  # 取1到10之间的随机整数(1 <= a <= 10)
print(a)
a = random.randrange(1, 10)  # 取1到10之间的随机整数(1 <= a <= 10)
print(a)
a = random.normalvariate(0, 1)  # 设置平均值为0,标准差为1的正态分布随机数
print(a)
a = random.choice(list("ABCDEFGHI"))  # 从序列中随机选择一个元素
print(a)
a = random.sample(list("ABCDEFGHI"), 3)  # 从序列中随机选择3个元素,不重复
print(a)
a = random.choices(list("ABCDEFGHI"), k=3)  # 从序列中随机选择3个元素,可以重复
print(a)
a = list("ABCDEFGHI")  # 打乱序列
random.shuffle(a)
print(a)

结果:

0.07673503583282937
2.079761431262405
8
6
0.7238775020583469
I
['E', 'B', 'H']
['B', 'F', 'F']
['C', 'H', 'A', 'I', 'F', 'B', 'D', 'E', 'G']

上面的代码每次运行时,生成的随机数都不一样。
为什么?因为随机数生成器是一个算法,它的结果是不确定的。
有办法让它确定的吗?下面的内容是解决这个问题的。

种子生成器

使用 random.seed() 函数,可以使得结果可重复,即在调用 random.seed() 后的函数调用链,会产生相同的数据。

这个种子值是一个整数,它的值决定了后续随机数序列的结果,一旦确定种子,也就无所谓随机了😀。

练习下面代码:

import random

print("设种子值为1:")
random.seed(1)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n设置种子值为42:")
random.seed(42)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n重新设置种子值为1:")
random.seed(1)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n重新设置种子值为42:")
random.seed(42)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

结果:

设种子值为1:
0.13436424411240122
8.626903632435095
B

设置种子值为42:
0.6394267984578837
1.2250967970040025
E

重新设置种子值为1:
0.13436424411240122
8.626903632435095
B

重新设置种子值为42:
0.6394267984578837
1.2250967970040025
E

通过示例输出可以看到,所谓的随机高度依赖设置的随机种子数。如果随机种子数确定,其实也就没有所谓的随机数了。惊不惊喜!

secrets 模块

secrets 模块提供了一个生成随机数的方法,可以用来生成密码、身份认证、安全令牌等。 特别的,secrets应该优先于默认的随机数生成器,但它常用来模拟随机模型,而不是加密和安全。

练习下面代码:

import secrets

a = secrets.randbelow(10)  # 随机一个10以内的数。
print(a)

a = secrets.randbits(5)  # 随机一个5位的二进制数。
print(a)

a = secrets.choice(list("ABCDEFGHI"))  # 从一个序列中随机选择一个元素。
print(a)

跟上面相同的原理,每次结果是不同的。

7
29
D

使用NumPy生成随机数

numpy伪随机数生成器与python标准库使用伪随机数生成器不同。 区别点,Python伪随机数设定种子值并不会影响NumPy伪随机数生成器。
numpy的种子需要单独设置。

练习下面代码:

import numpy as np

np.random.seed(1)
print(np.random.rand(3))  # 产生3个随机数
np.random.seed(1)
print(np.random.rand(3))  # 产生3个随机数
values = np.random.randint(0, 10, (5, 3))  # 产生5行3列的随机整数
print(values)
values = np.random.randn(5)  # 产生5个随机数,均值为0,标准差为1,服从标准正态分布
print(values)
# randomly shuffle a nd array.
# only shuffles the array along the first axis of a multi-dimensional array
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  #
np.random.shuffle(arr)
print(arr)

结果:

[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[[5 0 0]
 [1 7 6]
 [9 2 4]
 [5 2 4]
 [2 4 7]]
[-2.29230928 -1.41555249  0.8858294   0.63190187  0.04026035]
[[4 5 6]
 [7 8 9]
 [1 2 3]]

小节

本文简要分享了Python中常用的随机库,如randomsecrets等。

感谢你的阅读。欢迎大家点赞、收藏、支持!

pythontip 出品,Happy Coding!

公众号: 夸克编程

我们的小目标: 让天下木有难学的Python!

相关文章:

  • 数据库2-mysql环境搭建
  • Postman中的Pre-request Scrip详解
  • 知识变现海哥:如何把知识卖的更贵、更多、更酷
  • 中小商业银行主动安全纵深防御体系解决方案
  • 【HTML】表格标签,语义化
  • 如何从零开始解读什么叫产品经理
  • 基于竞争学习的粒子群优化算法-附代码
  • 猿创征文|忘记背后,努力面前【开学季flag】
  • 使用bloodyAD对域属性进行查询与修改
  • python——装饰器深入研究(二)
  • 前端面试谈:简历通用注意事项
  • Inveigh结合DNS v6配合NTLM Relay 的利用
  • Vue学习之--------路由的query、params参数、路由命名(3)(2022/9/5)
  • 华为交换机配置ACL
  • 离职总结(2022-9-5)
  • @angular/forms 源码解析之双向绑定
  • 「面试题」如何实现一个圣杯布局?
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • 0基础学习移动端适配
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Centos6.8 使用rpm安装mysql5.7
  • CSS 专业技巧
  • Git初体验
  • golang中接口赋值与方法集
  • Java基本数据类型之Number
  • jquery cookie
  • PHP的Ev教程三(Periodic watcher)
  • SpriteKit 技巧之添加背景图片
  • 从重复到重用
  • 工作手记之html2canvas使用概述
  • 每天一个设计模式之命令模式
  • 你真的知道 == 和 equals 的区别吗?
  • 区块链将重新定义世界
  • 使用Gradle第一次构建Java程序
  • 问题之ssh中Host key verification failed的解决
  • 线性表及其算法(java实现)
  • 学习笔记TF060:图像语音结合,看图说话
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 栈实现走出迷宫(C++)
  • 最简单的无缝轮播
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # centos7下FFmpeg环境部署记录
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (七)理解angular中的module和injector,即依赖注入
  • (强烈推荐)移动端音视频从零到上手(上)
  • (新)网络工程师考点串讲与真题详解
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一