python3.5
作用:实现了多种类型的伪随机数生成器
random模块基于Mersenne Twister 算法提供了一个快速伪随机数生成器。原先开发这个生成器是为了向蒙特卡洛模拟生成输入,Mersenne Twister算法会生成有一个大周期的近均匀分布的数,以适用于各种类型的应用。
1.生成随机数
random()函数从所生成的序列返回下一个随机的浮点数值。返回的所有值都在0-n之间。
import random
for i in range(5):
print("%04.3f" % random.random())
0.166
0.201
0.282
0.920
0.429
要生成一个指定数值区间内的数,则要使用uniform().
import random
for i in range(3):
print("%.3f" % random.uniform(1,100))
3.520
79.323
15.854
传入最大值和最小值,uniform()会使用公式min+(max-min)*random()来调整random()的返回值
2.指定种子
每次调用random()会生成不同的值,在一个非常的的周期之后数字才会重复。这对于生成唯一值或变化的值很有用,不过有些情况下可能需要提供相同的数据集,从而以不同的方式处理。对此,一种方法是使用一个程序来生成随机数,并保存这些随机数,以便通过一个单独的方式另行处理。不过对于量很大的数据来说可能并不实用,所以random包含了一个seed()函数,用来初始化伪随机数生成器,使它能生成一个期望的值集。
种子(seed)值会控制生成伪随机数所用公式产生的第一个值,由于公式是确定的,改变种子也就设置了整个要生成的序列。seed()的参数可以是任意可散列对象。默认会使用平台特定的随机源(如果有的话)。否则,会使用当前时间。
【伪随机数之所以是伪,应该就是这个原因了吧,种子定了,整个序列就定了,通过不短变换种子值得到随机数】
3.保存状态
random()使用的伪随机算法的内部状态可以保存,并用于控制后续各轮生成的随机数。继续生成随机数之前恢复前一个状态,这会减少有之前输入得到重复的值或值序列的可能性。getstate()函数会返回一些数据,以后可以用setstate()利用这些数据重新初始化伪随机数生成器。
import random
import os
import pickleif os.path.exists('state.dat'):
print("Found state.dat, initializing random module")
with open('state.dat','rb') as fp:
state=pickle.load(fp)
random.setstate(state)
else:
print("No state.dat, seeding")
random.seed(1)for i in range(3):
print("%.3f" % random.random())
print()with open('state.dat','wb') as fp:
pickle.dump(random.getstate(),fp)print("\nAfter saving state")
for i in range(3):
print("%.3f" % random.random())
print()
gerstate()返回的数据是一个实现细节,所以这个例子用pickle将数据保存到一个文件,不过可以把它当作一个黑盒。如果程序开始是这个文件存在,则加载原来的状态并继续。每次运行时都会在保存之前及之后生成一些书,以展示恢复状态会导致生成器在次生成同样的值
【相当于电影重放一样,设置一个节点getstate()[记录播放到的时间],用setstate()回到上次节点的时间,再次播放一遍】
4.随机整数
random()将生成浮点数。可以吧结果转换为整数,不过直接使用randint()生成整数会更方便。
import random
print("[1,100]")
for i in range(5):
print(random.randint(1,100),end=' ')
print()print("[-10,5]")
for i in range(5):
print(random.randint(-10,5),end=' ')
randint()的参数的值是闭区间的两端。这些数可以是正数或负数,不过第一个值要小于第二个值。
randrange()是从区间选择值的一种更一般的形式。除了开始值(start)和结束值(stop),randrange()还支持步长(step)参数,所以它完全等价于从range(start,stop,step)选择一个随机值。不过randrange更高效,因为它并没有真正构造区间。
5.选择随机元素 choice()
在一个序列中随机选择。
模拟抛硬币:
- import random
- out={'heads':0,'tail':0}
- sides=['heads','tail']
- for i in range(100000):
- out[random.choice(sides)]+=1
- print('head:',out['heads'])
- print('tail:',out['tail'])
这样不必再使用数字进行转换
。。。,排列,采样,多个并发生成器,SystemRandom,非均匀分布,角分布,大小分布