首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

random

源代码: 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)

longk个随机位返回一个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 <= bb <= N <= afor b < a

b取决于等式中的浮点舍入,终点值可能包含或不包含在范围内a + (b-a) * random()

random.triangular(low, high, mode)

返回一个随机的浮点数Nlow <= N <= high并使用这些边界之间的指定模式。该界默认的0和1。所述模式参数默认为边界之间的中点,给人一种对称分布。

2.6版本中的新功能。

random.betavariate(alpha, beta)

Beta分布。参数条件是alpha > 0beta > 0。返回值介于0和1之间。

random.expovariate(lambd)

指数分布。lambd是1.0除以所需的平均值。它应该是非零的。(该参数将被称为“拉姆达”,但是这是在Python保留字。)返回值的范围从0到正无穷大如果lambd为正,且从负无穷大到0,如果lambd为负。

random.gammavariate(alpha, beta)

伽马分布。(不是伽玛函数!)参数条件是alpha > 0beta > 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]

扫码关注腾讯云开发者

领取腾讯云代金券