Python模块学习7-random
模块说明
random模块用于生成随机数,是对常用的模块之一。
随机数实现原理解读
- 梅森旋转算法(Mersenne twister)实现伪随机数,
random.random()
方法应用此算法生成随机数。
以下摘录自维基百科:
梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士[1]在1997年开发,基于有限二进制字段上的矩阵线性递归 {\displaystyle F_{2}} F_{{2}}。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。
Mersenne Twister这个名字来自周期长度取自梅森素数的这样一个事实。这个算法通常使用两个相近的变体,不同之处在于使用了不同的梅森素数。
# step 1 用于初次取值
import time # 此时时间用于示例:time.time() => 1502074600.148464
a = long(time.time() * 256) # a = 384531097638L
a, x = divmod(a, 30268) # a = 12704212L, x = 8822L
a, y = divmod(a, 30306) # a = 419L, y = 5998L
a, z = divmod(a, 30322) # a = 0L, y = 419L
# step 2
x, y, z = int(x)+1, int(y)+1, int(z)+1 # x = 8823, y = 5999, z = 420
x = (171 * x) % 30269 # x = 25552
y = (172 * y) % 30307 # y = 1390
z = (170 * z) % 30323 # z = 10754
# 注:此时的x、y、z值继续用于step2中计算
print (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 # 0.24467627476378095
- 三角分布算法(Triangular distribution),将随机数处理后让其更接近众数,如众数为0.5,随机数为0.22时处理后可能是0.33, 随机数为0.8时处理后可能为0.7。
random.triangular()
方法应用此算法。
import random
u = random.random() #0到1之间的随机浮点数
low = 0 #最小值
high = 1 #最大值
c = 0.5 #指定众数,表示最接近的数
if u > c:
u = 1.0 - u
c = 1.0 - c
low, high = high, low
print low + (high - low) * (u * c) ** 0.5
方法用途表
函数名 | 原型 | 用途 |
---|---|---|
random | random(self) | 返回一个[0, 1)的浮点数 |
uniform | uniform(self, a, b) | 返回一个[a, b)的浮点数 |
randint | randint(a, b) | 返回一个[a, b]的整数 |
randrange | randrange(start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF)>>) | 返回一个[start, start+step, …, stop)之间的随机整数 |
choice | choice(seq) | 随机返回一个数组中的成员 |
shuffle | shuffle(x, random=None) | 修改x,将数组x中的元素乱序 |
sample | sample(population, k) | 从数组population中随机取出k个数 |
triangular | 不常用 | 用于三角形分布 |
normalvariate | 不常用 | 正太分布 |
lognormvariate | 不常用 | 对数正太分布 |
paretovariate | 不常用 | 帕累托分布 |
gauss | 不常用 | 高斯分布 |
gammavariate | 不常用 | 伽马分布 |
betavariate | 不常用 | β分布 |
expovariate | 不常用 | 指数分布 |
weibullvariate | 不常用 | Weibull分布 |
方法使用介绍, 默认预先引入import random
random.seed
seed(a=None)
:参见 随机数实现原理解读 中的step1,默认使用当前时间戳,可通过传递a参数自定义数值。
random.random
random()
:返回一个大于等于0小于1的浮点数
random.random() # 0.396058242610681
random.uniform
uniform(a, b)
:返回一个大于等于a小于b的浮点数
random.uniform(1, 10) # 1.9284943080764423
random.randint
randint(a, b)
:返回一个大于等于a小于等于b的整数,底层调用randrange(a, b)
random.randint(1,10) # 9
random.randrange
randrange(start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF)>>)
:一般参数_int和_maxwidth使用默认的,返回[start, start+step, …, stop)之间的随机整数。
random.randrange(1, 10, 3) # 4
random.choice
choice(seq)
:seq为数组,随机返回一个数组中的成员
random.choice([1, 3, 5]) # 3
random.shuffle
shuffle(x, random=None)
:x为数组,random为随机数生成函数,默认为自带的,作用是修改x将x中的成员乱序,此方法不返回内容
x = [1, 3, 5]
random.shuffle(x)
print x # [1, 5, 3]
random.sample
sample(population, k)
:population为数组,此方法从population中随机取出k位返回
random.sample([1, 3, 5], 2) #[1, 5]
random.triangular
triangular(self, low=0.0, high=1.0, mode=None)
:返回随机数经三角分布算法处理后的值,low为下限,high为上限,mode为众数,将随机数处理后更接近众数,参见 随机数实现原理解读 中的 三角分布算法 介绍。