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

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模块的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Python使用base64模块进行二进制数据编码详解

    前言 昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib.而POP服务器往回传的数据里有一部分需要用到Base64进行解码,所以就顺便看了下Python里面的base64模块. 本篇先讲一下base64模块,该模块提供了关于Base16,Base32,Base64,Base85和Ascii85的编码和解码相关的函数.有关poplib模块的内容,会在后面发上来.嗯,又挖了一个坑,这辈子挖的坑填不完了... 以下内容摘自http://bb

  • 用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例

    本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸 下面时具体的代码,已通过python3.6测试,可以成功运行: 对于所要爬取的网页连接可以通过王者荣耀官网找到, # -*- coding: utf-8 -*- """ Created on Wed Dec 13 13:49:52 2017 @author:KillerTwo """ import request

  • 简单了解python模块概念

    本文主要讲述的是Python中的模块的概念,具体如下. 模块是python组织代码的基本方式: python的脚本都是用扩展名为py的文本文件保存的. 一个脚本可以单独运行,也可以导入另一个脚本中运行. 当脚本被导入另一个脚本中运行时,我们将其称为模块. 模块名与脚本文件名相同: 比如你有一个items.py脚本, 则可以在另外一个脚本中用import items语句导入它 这是一段名字叫cal.py的python代码,它将被作为cal模块导入的后面的代码中: #!/usr/bin/python

  • Python3 queue队列模块详细介绍

    queue介绍 queue是python中的标准库,俗称队列. 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性. 注意: 在python2.x中,模块名为Queue queue模块有三种队列及构造函数 Python queue模块的FIFO队列先进先出. queue.Queue(maxsize) LIFO类似于堆,即先进后

  • Python编程pygame模块实现移动的小车示例代码

    Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚. 最近一个星期学习了一下python的pygame模块,顺便做个小程序巩固所学的,运行效果如下: 其中,背景图"highway.jpg"是使用PhotoShop将其分辨率改变为640 × 480,而小车"car.png"则是将其转变为png格式的图片,并且填充其背景色,让其拥有透明性. 代码测试可用: # -*

  • Python random模块用法解析及简单示例

    用法示例: import random # 1)随机小数 print(random.random()) # 获取大于0且小于1 之间的小数 random.random() print(random.uniform(1, 4)) # 获取大于1小于3的小数 # 2)随机整数 print(random.randint(1, 9)) # 获取大于等于1且小于等于9之间的整数 print(random.randrange(1, 9)) # 获取大于等于1且小于9之间的整数 print(random.ra

  • python Crypto模块的安装与使用方法

    前言 最开始想尝试在windows下面安装python3.6,虽然python安装成功,但在安装Cryto模块用pip3 install pycrypto老是会报错.老夫搞了半天,最终决定在linux下面去做. 以下流程限于linux系统: Crypto不是自带的模块,需要下载.http://www.voidspace.org.uk/python/modules.shtml#pycrypto 我下载了之后,发现下载的是crypto而不是Crypto(就是差个首字母大小写) 而crypto.Cip

  • Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序:画出y=x^3的散点图 样例代码如下: #coding=utf-8 import pylab as y #引入pylab模块 x = y.np.linspace(-10, 10, 100) #设置x横坐标范围和点数 y.plot(x, x*x*x,'or') #生成图像 ax = y.gca() a

  • Python用imghdr模块识别图片格式实例解析

    imghdr模块 功能描述:imghdr模块用于识别图片的格式.它通过检测文件的前几个字节,从而判断图片的格式. 唯一一个API imghdr.what(file, h=None) 第一个参数file可以是用rb模式打开的file对象或者表示路径的字符串和PathLike对象.h参数是一段字节串.函数返回表示图片格式的字符串. >>> import imghdr >>> imghdr.what('test.jpg') 'jpeg' 具体的返回值和描述如下: 返回值 描述

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

    random模块 用于生成伪随机数 源码位置: Lib/random.py(看看就好,千万别随便修改) 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的.而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的.我们可以这样认为这个可预见的结果其出现的概率是100%.所以用计算机随机函数所产生的"随机数"并不随机,是伪随机数. 计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值.所以,只要

  • Python中random模块用法实例分析

    本文实例讲述了Python中random模块用法.分享给大家供大家参考.具体如下: import random x = random.randint(1,4); y = random.choice(['appale','banana','cherry','durian']); print(x,y); 运行结果如下: (2, 'cherry') 不管学哪个语言,我总喜欢弄个随机数玩玩.农历十一月初六,Let's Python!!! l=[ ] while True: name=input("请输入

  • python的random模块及加权随机算法的python实现方法

    random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. •random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. •random.random()    用于生成一个随机浮点数n,0 <= n < 1 •random.uniform(a,b)    用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b; •random.randint(a,b)    用于生成一个指定范围内的整数,a

  • Python使用random模块生成随机数操作实例详解

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的方法,现将其总结如下: 此处,利用Python中的random模块生成随机数.因此首先必须导入该模块:import random 一. 随机产生一个元素 import random #生成一个0到1的随机浮点数: 0 <= n < 1.0 print(random.random()) >&g

  • 详解Python基础random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入random模块. import random 下面介绍下Python内置的random模块的几种生成随机数的方法. 1.random.random() 随机生成 0 到 1 之间的浮点数[0.0, 1.0) . print("random: ", random.random()) #rando

  • Python中random模块常用方法的使用教程

    前言 Python 的random模块包含许多随机数生成器. random是Python标准库之一,直接导入即可使用.本文介绍random中常用方法的用法. 一.生成随机的整数 # coding=utf-8 import random print(random.randint(1, 5)) print(random.randrange(0, 51, 5)) 运行结果: 3 40 randint(start, end)会返回一个start到end之间的整数,这里是左闭右闭区间.也就是说可能会返回e

  • python中random模块详解

    Python中的random模块用于生成随机数,它提供了很多函数.常用函数总结如下: 1. random.random() 用于生成一个0到1的随机浮点数: 0 <= n < 1.0 2. random.seed(n) 用于设定种子值,其中的n可以是任意数字.random.random() 生成随机数时,每一次生成的数都是随机的.但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个. 3. random.unifo

  • Python使用random模块实现掷骰子游戏的示例代码

    引入内容 根据人民邮电出版社出版的<Python程序设计现代设计方法>P102习题中的第7题--掷骰子游戏,进行代码编写. 题目要求 一盘游戏中,两人轮流掷骰子5次,并将每次掷出的点数累加,5局之后,累计点数较大者获胜,点数相同则为平局.根据此规则实现掷骰子游戏,并算出50盘之后的胜利者( 50盘中嬴得盘数最多的,即最终胜利者). 审题: 共有50盘游戏.一盘游戏有5局,每一局双方各掷骰子一次,5局结束以后统计分数,分数高的一方获胜.至此,一盘游戏结束.50盘游戏结束后,赢得盘数最多的一方为最

  • Python中random模块生成随机数详解

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniform random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成的随机数n: a <= n <= b.如果 a <

  • Python随机数random模块使用指南

    random 模块是Python自带的模块,除了生成最简单的随机数以外,还有很多功能. random.random() 用来生成一个0~1之间的随机浮点数,范围[0,10 >>> import random >>> random.random() 0.5038461831828231 random.uniform(a,b) 返回a,b之间的随机浮点数,范围[a,b]或[a,b),取决于四舍五入,a不一定要比b小. >>> random.uniform(

随机推荐