python模块介绍-random:生成伪随机数

jopen 10年前

python模块介绍-random:生成伪随机数

概述

这个模块实现的伪随机数生成器。

对于整数,从区间选取。对于序列,随机元素。

有函数生成均匀的,正态分布(高斯),对数正态分布,负指数,γ和β分布的随机数。对于角度分布,可以使用Mises分布。

几乎所有的函数依赖于基本函数random(),它生成区间[0.0, 1.0)的随机浮点。Python使用Mersenne Twister为核心的生成器。它生成53 bit精度的浮点值,周期为2的19937次方减1。 底层的C语言实现是快速和线程安全的。Mersenne Twister是目前最广泛的测试随机数生成器之一。然而因为生成的值是完全确定性的,所以不适合用于所有场合,尤其是加密。

该模块的函数实际上是random.Random类的隐藏实例random的方法。你可以实例化你自己Random来实现不共享状态的生成器。这对于多线程程序特别有用,为每个线程使用不同的实例,并使用jumpahead()方法使每个线程生成的序列不重叠。

类Random可以作为父类,random(), seed(), getstate(), setstate() and jumpahead()方法都可以重载。新生成器支持getrandbits()方法,允许randrange()方法在任意大区间中选择。

WichmannHill是Random的子类,用纯Python的实现了另外一个生成器。不推荐使用。

random模块还提供SystemRandom类使用系统函数os.urandom()产生随机数。

快速入门

>>> random.random()        # Random float x, 0.0 <= x < 1.00.37444887175646646>>> random.uniform(1, 10)  # Random float x, 1.0 <= x < 10.0 区间内的浮点数1.1800146073117523>>> random.randint(1, 10)  # Integer from 1 to 10, endpoints included7>>> random.randrange(0, 101, 2)  # Even integer from 0 to 100 Randrange不用生成range,会更高效26>>> random.choice('abcdefghij')  # Choose a random element'c'>>> items = [1, 2, 3, 4, 5, 6, 7]>>> random.shuffle(items)>>> items[7, 3, 2, 5, 6, 4, 1]>>> random.sample([1, 2, 3, 4, 5],  3)  # Choose 3 elements[4, 1, 5]

Seeding

Random()每次调用时会产生不同的值,设置了seed之后,就会产生有规律的恒定值。如果seed函数中没有提供参数, 就默认使用系统时间.

import randomrandom.seed(1)for i in xrange(5):      print '%04.3f' % random.random(),print

执行结果, 每次都产生一样的结果:

# python random_seed.py0.134 0.847 0.764 0.255 0.495

保存状态

random()使用的伪随机算法的内部状态可以保存起来并用于控制在后续运行中产生的数字以减少重复的值或值序列的可能。相关的函数为 getstate()和setstate()。random.seed 提供了随机数生成的起点,可以用来生成一样的随机数。默认为当前时间作为起点。随机生成的状态可以通过getstate()保存,通过 setstate()恢复。

import randomimport osimport cPickle as pickleif os.path.exists('state.dat'):      # Restore the previously saved state      print 'Found state.dat, initializing random module'      with open('state.dat', 'rb') as f:          state = pickle.load(f)      random.setstate(state)else:      # Use a well-known start state      print 'No state.dat, seeding'      random.seed(1)# Produce random valuesfor i in xrange(3):      print '%04.3f' % random.random(),print# Save state for next timewith open('state.dat', 'wb') as f:      pickle.dump(random.getstate(), f)# Produce more random valuesprint '\nAfter saving state:'for i in xrange(3):      print '%04.3f' % random.random(),print

执行结果:

# python random_state.pyFound state.dat, initializing random module0.255 0.495 0.449After saving state:0.652 0.789 0.094

本文地址

参考资料