Python | random 模块:Python 中如何生成随机数和随机抽样?
random 是平时开发过程中常用的一个模块,该模块实现了各种分布的伪随机数生成器,以及和随机数相关的各种实用函数。基本函数 random() 在区间 [0.0, 1.0) 内均匀生成随机浮点数,是模块中几乎所有函数的基础。
Python 使用 Mersenne Twister 作为核心生成器,由于完全确定性(对于给定的初始化条件,生成的随机数序列完全确定,所以称为“伪随机数”),该模块不适用于安全或加密用途。
由于入门语言是 C 语言,所以最开始用 Python 的时候还写过
x = int(random() * a + b)这样的憨憨代码(捂脸)。翻看文档之后才发现标准库中提供了很多便捷的函数,做个笔记记录一下。
生成整数
random.randrange(stop) / random.randrange(start, stop[, step])
从 range(start, stop[, step]) 中随机选择一个整数,参数的意义与 range() 完全一致,即左闭右开。
randrange(3) # 0, 1, 2
randrange(2, 5) # 2, 3, 4
randrange(2, 8, 2) # 2, 4, 6
random.randint(a, b)
最常用的随机整数方法,返回整数 N 满足 a <= N <= b。相当于 randrange(a, b+1)。
生成实数(浮点数)
除了常用的均匀分布,random 模块提供了很多种概率分布模式的随机数,对应的分布方程以及参数与数学中的命名相对应。这里只简单列出几个比较常见的。
random.random()
均匀分布,生成 [0.0, 1.0) 之间的浮点数
random.uniform(a, b)
均匀分布,生成 a 到 b 之间的浮点数(包含端点),不需要保证 a <= b
random.expovariate(lambd)
指数分布,参数 lambd != 0
random.gammavariate(alpha, beta)
Gamma 分布,alpha > 0, beta > 0
random.gauss(mu, sigma) / random.normalvariate(mu, sigma)
正态分布(高斯分布),mu - 平均值,sigma - 标准差(>0)
- 两者功能相同,前者速度略快,后者线程安全
序列/选择
random.choice(seq)
从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError
random.choices(population, weights=None, *, cum_weights=None, k=1)
返回从 population 进行 k 次随机抽样结果的列表,即有重复(有放回)随机抽样。
可以指定每个元素对应的权重,如果未指定权重默认为等概率选择
- weight 序列:指定相对权重
- cum_weights 序列:指定累积权重
- 例:相对权重
[10, 5, 30, 5]相当于累积权重[10, 15, 45, 50]
- 例:相对权重
- 如果提供了权重序列,则它必须与 population 序列的长度相同
random.shuffle(x[, random])
将序列 x 随机打乱位置。将改变 x 序列本身,而不是将新列表返回,因此传入的 x 必须是可变列表(例如 list),如果传入不可变对象(例如 tuple)会产生错误。random 是一个0参数函数,在 [0.0, 1.0) 中返回随机浮点数,默认为 random()。
由于全排列数量为阶乘增长,因此对于默认的随机数生成器,如果输入序列的长度超过 2080,那么大多数排列永远不可能出现。
random.sample(population, k, *, counts=None)
不改变原序列 population,返回序列中不重复的 k 个元素的列表,即无重复随机抽样。要从一系列整数中选择样本,建议使用 range() 对象作为参数
序列中可以包含重复的元素,重复的元素可能会被同时选中(即完全按照给定列表选择,不会进行去重)
- (Python >= 3.9)参数 counts 可以表示重复的元素。 例如,
sample(['red', 'blue'], counts=[4, 2], k=5)等价于sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)。
>>> choice(['win', 'lose', 'draw']) # 随机选择一个元素
'draw'
>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6) # 加权抽取6个元素(有重复)
['red', 'green', 'black', 'black', 'red', 'black']
>>> deck = 'ace two three four'.split()
>>> shuffle(deck) # 打乱列表
>>> deck
['four', 'two', 'ace', 'three']
>>> sample([10, 20, 30, 40, 50], k=4) # 抽取4个随机样本(无重复)
[40, 10, 50, 30]
再现序列
有时需要重现伪随机数的序列。
random.seed(a=None)
使用种子 a(NoneType, int, float, str, bytes 或 bytearray)初始化随机数生成器,默认使用当前系统时间。通过重用一个种子值,可以在多次运行中再现相同的随机序列(不考虑多线程情况)
random.getstate() / random.setstate(state)
捕获/恢复生成器内部状态,可以在单次运行中复现随机序列
>>> status = random.getstate()
>>> random.random()
0.41528974297057974
>>> random.random()
0.5554723616955235
>>> random.setstate(status)
>>> random.random()
0.41528974297057974
>>> random.random()
0.5554723616955235
参考文献
Python | random 模块:Python 中如何生成随机数和随机抽样?的更多相关文章
- [python]-random模块-手动随机数
random模块通常用来生成随机数,结合time模块生成随机数的代码: import time import random random.seed(time.time()) x = random.ra ...
- Python random模块 例子
最近用到随机数,就查询资料总结了一下Python random模块(获取随机数)常用方法和使用例子. 1.random.random random.random()用于生成一个0到1的随机符点数: ...
- python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET
python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET python random模块 分类: python 2011-11-15 15:31 6037人阅读 评论(2) ...
- python random模块(14)
random 模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序. 一.random模块常用函数介绍 random.random() — 生成一个从0.0(包含)到 1.0(不包含)之间 ...
- python random从集合中随机选择元素
1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...
- python random模块导入及用法
random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法 1,模块导入 import random 2,random用法 random.r ...
- python random模块(随机数)详解
使用前要先导入random模块 import random random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random ...
- Python random模块(获取随机数)常用方法和使用例子
random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...
- Python random模块(获取随机数)
1.random.random 随机生成一个0到1的随机浮点数: 0 <= n < 1.0 In [2]: print random.random() 0.544824016934 2.r ...
随机推荐
- Web 全栈开发 Redis 面试题
Web 全栈开发 Redis 面试题 Redis 大 key 问题 https://www.cnblogs.com/xgqfrms/p/13601959.html Redis 数据结构 Redis 初 ...
- GitHub & JavaScript & Trending
GitHub & JavaScript & Trending Trending JavaScript repositories on GitHub this week https:// ...
- SPC算力币异军突起,或将跑赢币圈全场
比特币在出现反弹以后,并没有向上突破,而是回调,目前已经跌破了35000美金.目前,整个市场都在关注着比特币的动向,毕竟,比特币的走势,关注着资本的流向.不过,也有一部分巨鲸们将目光对准了币圈的其它数 ...
- 为什么10月上线的NGK Global即将燎原资本市场
近日据社区透露,NGK Global将在10月全面启动,数据公开透明,人人可以参与运营监管. 现在,区块链经济已经处于爆发前夜.金融行业的探索领先一筹,而其他行业的应用正在快速展开.区块链行业应用头部 ...
- JULLIAN MURPHY:拥有良好的心态,运气福气便会自来
JULLIAN MURPHY是星盟全球投资公司的基金预审经理,负责星盟投资项目预审,有着资深的基金管理经验,并且在区块链应用的兴起中投资了多个应用区块链技术的公司. JULLIAN MURPHY认为往 ...
- ASP.NET Core中如何对不同类型的用户进行区别限流
老板提出了一个新需求,从某某天起,免费用户每天只能查询100次,收费用户100W次. 这是一个限流问题,聪明的你也一定想到了如何去做:记录用户每一天的查询次数,然后根据当前用户的类型使用不同的数字做比 ...
- Codeforces 1485F Copy or Prefix Sum
题目链接 点我跳转 题目大意 给定一个长度为 \(N\) 的序列 \(bi\) 问有多少个长度为 \(N\) 的序列 \(a\) 使得 \(b[i] = a[i]\) 或 \(b[i] = ∑a[j] ...
- C++算法代码——n的全排列/全排列问题
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1541 题目描述 输入一个整数n,输出的n(n<=100)的全排列. 输入 输入 ...
- C++算法代码——级数求和[NOIP2002 普及组]
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1078 或者:https://www.luogu.com.cn/problem/P10 ...
- Scrapy项目_阳光热线问政平台
目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...