random
random — Generate pseudo-random numbers
源代码:
Lib / random.py
该模块为各种分配实施伪随机数发生器。
对于整数,从一个范围统一选择。对于序列,随机元素的统一选择,就地生成列表的随机置换的函数,以及无需替换的随机采样函数。
在实际情况中,有函数可以计算均匀,正态(高斯),对数正态,负指数,伽玛和贝塔分布。为了产生角度分布,冯·米塞斯分布是可用的。
几乎所有的模块函数都依赖于基本函数random()
,它在半开放范围[0.0,1.0)内均匀地生成随机浮点数。Python使用Mersenne Twister作为核心生成器。它生成53位精度浮点数,周期为2 ** 19937-1。C中的底层实现既快速又线程安全。Mersenne Twister是现存最广泛测试的随机数生成器之一。然而,它是完全确定性的,并不适用于所有目的,并且完全不适用于加密目的。
这个模块提供的函数实际上是random.Random
类的隐藏实例的绑定方法。您可以实例化您自己的实例Random
以获取不共享状态的生成器。这对多线程程序特别有用,Random
为每个线程创建一个不同的实例,并使用该jumpahead()
方法使每个线程看到的生成序列不重叠。
类Random
也可以,如果你想用你自己设计的不同的基本发电机子类:在这种情况下,覆盖random()
,seed()
,getstate()
,setstate()
和jumpahead()
方法。可选地,新的发生器可以提供一种getrandbits()
方法 - 这允许randrange()
在任意大的范围内产生选择。
版本2.4中的新功能:该getrandbits()
方法。
作为子类的一个例子,random
模块提供了WichmannHill
在纯Python中实现替代生成器的类。该类提供了一种向后兼容的方式来重现Python早期版本的结果,该版本使用Wichmann-Hill算法作为核心生成器。请注意,这个Wichmann-Hill发生器不能再推荐使用:它的周期由于现代标准而太短,并且产生的序列已知会通过一些严格的随机性测试。请参阅下面的参考资料,了解修复这些缺陷的最新变体。
在版本2.3中更改:MersenneTwister将Wichmann-Hill替换为默认生成器。
该random
模块还提供了SystemRandom
使用系统函数os.urandom()
从操作系统提供的源生成随机数的类。
警告
该模块的伪随机生成器不应用于安全目的。使用os.urandom()
或者SystemRandom
如果你需要一个密码安全的伪随机数字发生器。
簿记功能:
random.seed(a=None)
初始化随机数发生器的内部状态。
None
或者从当前时间或从操作系统特定的随机源(如果可用)没有参数种子(os.urandom()
有关可用性的详细信息,请参阅该函数)。
如果a
不是None
或a
int
或a
long
,则hash(a)
用它代替。请注意,某些类型的哈希值在PYTHONHASHSEED
启用时不确定。
在版本2.4中更改:以前没有使用操作系统资源。
random.getstate()
返回捕获发生器当前内部状态的对象。该对象可以传递setstate()
到恢复状态。
2.1版本中的新功能。
版本2.6中更改:在Python 2.6中生成的状态值不能加载到早期版本中。
random.setstate(state)
状态
应该是从以前的调用中获得的getstate()
,并将setstate()
发生器的内部状态
恢复到当时getstate()
所调用的状态
。
2.1版本中的新功能。
random.jumpahead(n)
将内部状态更改为与当前状态不同并可能远离的状态。n
是用于扰乱当前状态向量的非负整数。这对于多线程程序以及Random
类的多个实例是非常有用的:setstate()
或者seed()
可以用来强制所有实例进入相同的内部状态,然后jumpahead()
可以用来强制实例的状态相隔甚远。
2.1版本中的新功能。
在版本2.3中进行了更改:跳到特定状态,前进n
步,jumpahead(n)
跳转到另一个可能被多个步骤分隔的状态。
random.getrandbits(k)
long
用k个
随机位返回一个python int 。该方法由MersenneTwister生成器提供,其他一些生成器也可以将其作为API的可选部分提供。可用时,getrandbits()
可以randrange()
处理任意大的范围。
2.4版本中的新功能。
整数函数:
random.randrange(stop)random.randrange(start, stop[, step])
从中随机选择一个元素range(start, stop, step)
。这相当于choice(range(start, stop, step))
,但实际上并不构建范围对象。
1.5.2版本的新功能。
random.randint(a, b)
返回一个随机整数N使得a <= N <= b。
序列的功能:
random.choice(seq)
从非空序列seq中
返回一个随机元素。如果seq
为空,则引发IndexError
。
random.shuffle(x[, random])
将序列x
随机混合。可选参数random
是一个0参数函数,返回[0.0,1.0)中的随机浮点数; 默认情况下,这是该功能random()
。
请注意,即使相当小len(x)
,x
的排列总数大于大多数随机数发生器的周期; 这意味着长序列的大部分排列永远不会生成。
random.sample(population, k)
返回从总体序列中选择的独特元素的k
长度列表。用于无需更换的随机抽样。
2.3版本的新功能。
返回包含来自群体的元素的新列表,同时保持原始人口不变。结果列表按选择顺序排列,以便所有子片也将是有效的随机样本。这允许抽奖获奖者(样本)被划分为大奖和第二名获奖者(子公司)。
人口成员不必是可排除的或独特的。如果总体包含重复,则每个事件都是样本中可能的选择。
要从一系列整数中选择一个样本,请使用一个xrange()
对象作为参数。这对于从大量人群中抽样来说尤其快速且节省空间:sample(xrange(10000000), 60)
。
以下函数生成特定的实值分布。函数参数是根据分布方程中的相应变量命名的,正如常用的数学实践中所用的那样; 大多数这些方程可以在任何统计文本中找到。
random.random()
返回范围[0.0,1.0)中的下一个随机浮点数。
random.uniform(a, b)
返回一个随机浮点数N,以便a <= N <= bfor a <= b和b <= N <= afor b < a。
b
取决于等式中的浮点舍入,终点值可能包含或不包含在范围内a + (b-a) * random()
。
random.triangular(low, high, mode)
返回一个随机的浮点数N,low <= N <= high并使用这些边界之间的指定模式。该低和高界默认的0和1。所述模式参数默认为边界之间的中点,给人一种对称分布。
2.6版本中的新功能。
random.betavariate(alpha, beta)
Beta分布。参数条件是alpha > 0和beta > 0。返回值介于0和1之间。
random.expovariate(lambd)
指数分布。lambd
是1.0除以所需的平均值。它应该是非零的。(该参数将被称为“拉姆达”,但是这是在Python保留字。)返回值的范围从0到正无穷大如果lambd
为正,且从负无穷大到0,如果lambd
为负。
random.gammavariate(alpha, beta)
伽马分布。(不是伽玛函数!)参数条件是alpha > 0和beta > 0。
概率分布函数是:
x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) = --------------------------------------
math.gamma(alpha) * beta ** alpha
random.gauss(mu, sigma)
高斯分布。mu
是平均值,而σ
是标准偏差。这比normalvariate()
下面定义的函数稍快。
random.lognormvariate(mu, sigma)
记录正态分布。如果你采用这种分布的自然对数,你将得到一个平均值为mu
和标准偏差σ的
正态分布。亩
可以有任何价值,西格玛
必须大于零。
random.normalvariate(mu, sigma)
正态分布。mu
是平均值,而σ
是标准偏差。
random.vonmisesvariate(mu, kappa)
mu
是平均角度,以弧度表示,介于0和2 * pi之间
,kappa
是浓度参数,必须大于或等于零。如果kappa
等于零,则该分布在0到2 * pi
的范围内降低到均匀的随机角度。
random.paretovariate(alpha)
帕累托分布。alpha
是形状参数。
random.weibullvariate(alpha, beta)
威布尔分布。alpha
是比例参数,beta
是形状参数。
替代发电机:
class random.WichmannHill([seed])
实现Wichmann-Hill算法的类作为核心生成器。具有所有相同的方法Random
以及whseed()
下面描述的方法。因为这个类是用纯Python实现的,所以它不是线程安全的,可能需要调用之间的锁。发生器的周期是6,953,607,871,644,它足够小以至于需要注意两个独立的随机序列不重叠。
random.whseed([x])
这是过时的,提供了与2.1之前的Python版本的位级兼容性。详情请参阅seed()
。whseed()
不能保证不同的整数参数产生不同的内部状态,并且总共可以产生不超过约2 ** 24个不同的内部状态。
class random.SystemRandom([seed])
使用该os.urandom()
函数从操作系统提供的源生成随机数的类。不适用于所有系统。不依赖软件状态,序列不可重现。因此,seed()
和jumpahead()
方法都没有效果,被忽略。该getstate()
和setstate()
方法提高NotImplementedError
,如果调用。
2.4版本中的新功能。
基本用法的例子:
>>> random.random() # Random float x, 0.0 <= x < 1.0
0.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 included
7
>>> random.randrange(0, 101, 2) # Even integer from 0 to 100
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]