你真的了解Python的random模块吗?


Posted in Python onDecember 12, 2017

random模块

用于生成伪随机数
源码位置: Lib/random.py(看看就好,千万别随便修改)

真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。

计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。

只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。

Python的这个库在底层使用通用的算法,经过长久的考验,可靠性没得说,但绝对不能用于密码相关的功能。

一、基本方法

random.seed(a=None, version=2)
初始化伪随机数生成器。如果未提供a或者a=None,则使用系统时间为种子。如果a是一个整数,则作为种子。

random.getstate()
返回一个当前生成器的内部状态的对象

random.setstate(state)
传入一个先前利用getstate方法获得的状态对象,使得生成器恢复到这个状态。

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

二、针对整数的方法

random.randrange(stop)

random.randrange(start, stop[, step])
等同于choice(range(start, stop, step)),但并不实际创建range对象。

random.randint(a, b)
返回一个a <= N <= b的随机整数N。等同于 randrange(a, b+1)

三、针对序列类结构的方法

random.choice(seq)
从非空序列seq中随机选取一个元素。如果seq为空则弹出 IndexError异常。

random.choices(population, weights=None, *, cum_weights=None, k=1)
3.6版本新增。从population集群中随机抽取K个元素。weights是相对权重列表,cum_weights是累计权重,两个参数不能同时存在。

random.shuffle(x[, random])
随机打乱序列x内元素的排列顺序。只能针对可变的序列,对于不可变序列,请使用下面的sample()方法。

random.sample(population, k)
从population样本或集合中随机抽取K个不重复的元素形成新的序列。常用于不重复的随机抽样。返回的是一个新的序列,不会破坏原有序列。要从一个整数区间随机抽取一定数量的整数,请使用sample(range(10000000), k=60)类似的方法,这非常有效和节省空间。如果k大于population的长度,则弹出ValueError异常。

四、真值分布

random模块最高端的功能其实在这里。

random.random()
返回一个介于左闭右开[0.0, 1.0)区间的浮点数

random.uniform(a, b)
返回一个介于a和b之间的浮点数。如果a>b,则是b到a之间的浮点数。这里的a和b都有可能出现在结果中。

random.triangular(low, high, mode)
返回一个low <= N <=high的三角形分布的随机数。参数mode指明众数出现位置。

random.betavariate(alpha, beta)
β分布。返回的结果在0~1之间

random.expovariate(lambd)
指数分布

random.gammavariate(alpha, beta)
伽马分布

random.gauss(mu, sigma)
高斯分布

random.lognormvariate(mu, sigma)
对数正态分布

random.normalvariate(mu, sigma)
正态分布

random.vonmisesvariate(mu, kappa)
卡帕分布

random.paretovariate(alpha)
帕累托分布

random.weibullvariate(alpha, beta)

五、可选择的生成器

class random.SystemRandom([seed])
使用 os.urandom() 方法生成随机数的类,由操作系统提供源码,不一定所有系统都支持

六、典型的例子

>>> random()               # 随机浮点数: 0.0 <= x < 1.0
0.37444887175646646

>>> uniform(2.5, 10.0)          # 随机浮点数: 2.5 <= x < 10.0
3.1800146073117523

>>> randrange(10)            # 0-9的整数:
7

>>> randrange(0, 101, 2)         # 0-100的偶数
26

>>> choice(['win', 'lose', 'draw'])   # 从序列随机选择一个元素
'draw'

>>> deck = 'ace two three four'.split()
>>> shuffle(deck)            # 对序列进行洗牌,改变原序列
>>> deck
['four', 'two', 'ace', 'three']

>>> sample([10, 20, 30, 40, 50], k=4)  # 不改变原序列的抽取指定数目样本,并生成新序列
[40, 10, 50, 30]

>>> # 6次旋转红黑绿轮盘(带权重可重复的取样),不破坏原序列
>>> choices(['red', 'black', 'green'], [18, 18, 2], k=6)
['red', 'green', 'black', 'black', 'red', 'black']

>>> # 德州扑克计算概率Deal 20 cards without replacement from a deck of 52 playing cards
>>> # and determine the proportion of cards with a ten-value
>>> # (a ten, jack, queen, or king).
>>> deck = collections.Counter(tens=16, low_cards=36)
>>> seen = sample(list(deck.elements()), k=20)
>>> seen.count('tens') / 20
0.15

>>> # 模拟概率Estimate the probability of getting 5 or more heads from 7 spins
>>> # of a biased coin that settles on heads 60% of the time.
>>> trial = lambda: choices('HT', cum_weights=(0.60, 1.00), k=7).count('H') >= 5
>>> sum(trial() for i in range(10000)) / 10000
0.4169

>>> # Probability of the median of 5 samples being in middle two quartiles
>>> trial = lambda : 2500 <= sorted(choices(range(10000), k=5))[2] < 7500
>>> sum(trial() for i in range(10000)) / 10000
0.7958

下面是生成一个包含大写字母A-Z和数字0-9的随机4位验证码的程序

import random
 
checkcode = ''
for i in range(4):
  current = random.randrange(0,4)
  if current != i:
    temp = chr(random.randint(65,90))
  else:
    temp = random.randint(0,9)
  checkcode += str(temp)
print(checkcode)

下面是生成指定长度字母数字随机序列的代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random, string

def gen_random_string(length):
  # 数字的个数随机产生
  num_of_numeric = random.randint(1,length-1)
  # 剩下的都是字母
  num_of_letter = length - num_of_numeric
  # 随机生成数字
  numerics = [random.choice(string.digits) for i in range(num_of_numeric)]
  # 随机生成字母
  letters = [random.choice(string.ascii_letters) for i in range(num_of_letter)]
  # 结合两者
  all_chars = numerics + letters
  # 洗牌
  random.shuffle(all_chars)
  # 生成最终字符串
  result = ''.join([i for i in all_chars])
  return result

if __name__ == '__main__':
  print(gen_random_string(64))

总结

以上就是本文关于你真的了解Python的random模块的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python实现的重启关机程序实例
Aug 21 Python
详解Django中的form库的使用
Jul 18 Python
Linux 修改Python命令的方法示例
Dec 03 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Python实现AI自动抠图实例解析
Mar 05 Python
jupyter notebook参数化运行python方式
Apr 10 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
Python读写锁实现实现代码解析
Nov 28 Python
python实现socket简单通信的示例代码
Apr 13 Python
Python判断两个对象相等的原理
Dec 12 #Python
浅谈Django REST Framework限速
Dec 12 #Python
Django admin美化插件suit使用示例
Dec 12 #Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 #Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 #Python
Python有序查找算法之二分法实例分析
Dec 11 #Python
django实现用户登陆功能详解
Dec 11 #Python
You might like
Php获取金书网的书名的实现代码
2010/06/11 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
Seajs源码详解分析
2019/04/02 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
python对字典进行排序实例
2014/09/25 Python
Python基于twisted实现简单的web服务器
2014/09/29 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python装饰器的特性原理详解
2019/12/25 Python
解决python replace函数替换无效问题
2020/01/18 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
师范毕业生自荐信
2013/10/17 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
务虚会发言材料
2014/12/25 职场文书
司考复习计划
2015/01/19 职场文书
画展观后感
2015/06/17 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers