您的位置:首页 > 编程语言 > Python开发

Python random模块

2013-06-13 19:55 375 查看
random模块的作用:实现了多种类型的伪随机生成器。

1 random.random() 返回一个随机的浮点数值:range[0.0,1.0)

import random
for i in range(5):
print('%04.3f ' % random.random(), end='')
#输出0.964 0.304 0.550 0.519 0.082
重复运行这个程序会生成不同的数字序列。

2 random.uniform(a,b) 返回一个指定数值区间的数。传入a和b,uniform()会用公式a+(b-a)*random()调整random()生成一个指定区间的浮点数值。其中a可以大于、小于、等于b。当a!=b时,会生成介于两者之间的浮点数,当a=b时,返回a。

import random
print('%04.3f ' % random.uniform(1, 10), end='')
print('%04.3f ' % random.uniform(10, 1), end='')
print('%04.3f ' % random.uniform(1, 1), end='')
# 输出3.653 2.895 1.000
3 random.seed() 通过指定种子来生成一个期望的值集。种子(seed)值会控制生成伪随机数所用公式的第一个值,由于公式是确定性的,改变种子后也就设置了要生成的整个序列。seed()参数可以是任意可散列对象。如果没有指定参数,则会使用当前时间。

import random
random.seed(0)
for i in range(5):
print('%04.3f ' % random.random(), end='')
# 输出0.844 0.758 0.421 0.259 0.511

重复运行这个程序会生成相同的数字序列。

4 random.randint(a,b) 用来生成一个指定区间的整数值,取值范围[a,b]。其中要求a小于等于b。

import random
print('%d ' % random.randint(1, 10), end='')
print('%d ' % random.randint(1, 1), end='')
print('%d ' % random.randint(10, 1), end='')
#输出6 1 error

5 random.randrange([start],stop[,step])除了开始值(start)和结束值(end),randrange()还支持一个步长(step)参数,所以完全等价于从range(start,stop,step)选择一个随机值。不过randrange()更高效,因为它并没有真正构造区间。从python3.2开始randrange()更复杂的返回一个数,在3.2版本之前,使用像int(random()*n)的样式会产生轻微的不均匀分布。

import random
print('%d ' % random.randrange(1, 10), end='')  # 输出[1,10)之间的任意数
print('%d ' % random.randrange(1, 10, 3), end='')  # 输出序列[1,4,7]中一个数

6 random.choice(seq) 可以在一个序列中随机选择,参数seq表示一个有序类型,并不是一种特定类型,泛指list,tuple,字符串等。

import random
print(random.choice(range(10)))  # 输出2
print(random.choice('hello'))  # 输出h
print(random.choice(['hello', 'world']))  # 输出hello
print(random.choice(('hello', 'world')))  # 输出world
下面举一个例子来模拟抛硬币1000次,来统计多少次面朝上,多少次面朝下。

import random
outcomes = {'heads':0, 'tails':0}
sides = list(outcomes.keys())
for i in range(1000):
outcomes[random.choice(sides)] += 1
print('Heads:', outcomes['heads'], end='')
print(' Tails:', outcomes['tails'], end='')  # 输出Heads: 491 Tails: 509
7 random.shuffle(x[,random])用于将序列x打乱。

import random
x = ['hello', 'world', 'I', 'love', 'Python']
random.shuffle(x)
print(x)  # 输出乱序的序列x

8 random.sample(population,k) 可以从序列中无重复选择k个值,且不会改变原有序列。

import random
x = ['hello', 'world', 'I', 'love', 'Python']
print(random.sample(x, 2))  # 输出['Python', 'world']
print(x)  # 输出['hello', 'world', 'I', 'love', 'Python']

9 多个并发生成器

除了模块级函数,random还包括一个Random类来管理多个随机数生成器的内部状态。之前介绍的所有函数都可以作为Random实例的方法得到,而且各个实例可以单独初始化和使用,而不会与其他实例返回的值相互干扰。

import random
import time
print('Default initializiation:')
r1 = random.Random()
r2 = random.Random()
for i in range(3):
print('%4.3f %4.3f' % (r1.random(), r2.random()))
print('same seed:')
seed = time.time()
r1 = random.Random(seed)
r2 = random.Random(seed)
for i in range(3):
print('%4.3f %4.3f' % (r1.random(), r2.random()))
程序运行后的结果:Default initializiation:

0.062 0.183

0.209 0.923

0.663 0.724

same seed:

0.968 0.968

0.535 0.535

0.020 0.020

如果系统上设置了很好的内置随机值种子,不同实例会有惟一的初始状态。不过,如果没有一个好的平台随机值生成器,不同实例往往会用当前时间作为种子,因此会生成相同的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: