用于生成伪随机数 源码位置: 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 位验证码的程序
- importrandom
- checkcode= ''
- foriin range(4):
- current=random.randrange(0,4)ifcurrent!=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 -*-
- importrandom, stringdefgen_random_string(length):# 数字的个数随机产生num_of_numeric=random.randint(1,length-1)# 剩下的都是字母num_of_letter=length-num_of_numeric# 随机生成数字numerics=[random.choice(string.digits)foriin range(num_of_numeric)]# 随机生成字母letters=[random.choice(string.ascii_letters)foriin range(num_of_letter)]# 结合两者all_chars=numerics+letters# 洗牌random.shuffle(all_chars)# 生成最终字符串result= ''.join([iforiinall_chars])returnresultif __name__ == '__main__':print(gen_random_string(64))
来源: http://www.cnblogs.com/feixuelove1009/p/6863153.html