9.6. random — Generate pseudo-random numbers

Source code: Lib/random.py  翻译:Z.F.


This module implements pseudo-random number generators for various distributions.

此模块实现伪随机数生成和各种分布

For integers, there is uniform selection from a range. For sequences, there is uniform selection of a random element, a function to generate a random permutation of a list in-place, and a function for random sampling without replacement.

对于整数,这是一个范围内的唯一一个数;对于序列,这是随机选择的一个元素 ;一个函数,生成一个列表的恰当的随机排序,或者生成无替换的随机抽样。

On the real line, there are functions to compute uniform, normal (Gaussian), lognormal, negative exponential, gamma, and beta distributions. For generating distributions of angles, the von Mises distribution is available.

实际上,是一些计算统一分布,正态(高斯)分布,对数正态分布,复指数分布,伽马分布,和贝塔分布。生成角度分布和冯·米塞斯分布时可用的。

Almost all module functions depend on the basic function random(), which generates a random float uniformly in the semi-open range [0.0, 1.0). Python uses the Mersenne Twister as the core generator. It produces 53-bit precision floats and has a period of 2**19937-1. The underlying implementation in C is both fast and threadsafe. The Mersenne Twister is one of the most extensively tested random number generators in existence. However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.

 几乎所有的模块函数都依赖于基础的  random() 函数,该函数在一个半开放的范围 [0.0, 1.0)内(包括0.0,不包括1.0),产生一个随机的,单一的浮点数.python使用梅森扭曲算法作为核心的生成器,它产生53位精度的浮点数,并且以2**19937-1作为一个周期。下面算法用C实现,既是快速的也是线程安全的。梅森扭曲算法是目前实际使用中的经过广泛测试的随机数生成器之一。然而,可以完全确定的是,它并不适合所有的目的,并且完全不适合加密的目的。

The functions supplied by this module are actually bound methods of a hidden instance of the random.Random class. You can instantiate your own instances of Random to get generators that don’t share state.

该模块提供的函数实际上,绑定在一个隐藏的random.Random类的实例上,你可以实现你自己的random实例去获得一个不共享状态的生成器。

Class Random can also be subclassed if you want to use a different basic generator of your own devising: in that case, override the random(), seed(), getstate(), and setstate() methods. Optionally, a new generator can supply a getrandbits() method — this allows randrange() to produce selections over an arbitrarily large range.

random类也可以子类化,如果你想使用一个不同于基础生成器的生成器,如果要那样做,就覆写random()seed(),getstate(),  setstate() 方法。还可以更进一步的提供一个getrandbits() 方法,它使得randrange()函数可以产生任意大范围的选项

The random module also provides the SystemRandom class which uses the system function os.urandom() to generate random numbers from sources provided by the operating system.

 random模块还提供了使用系统函数 os.urandom() 来产生随机数的SystemRandom 类, os.urandom() 函数使用操作系统提供的资源。

Warning

警告

The pseudo-random generators of this module should not be used for security purposes. Use os.urandom() or SystemRandom if you require a cryptographically secure pseudo-random number generator.

本模块的伪随机数生成器不应该被应用于安全目的,如果你需要一个加密的安全的伪随机数生成器,请使用os.urandom()函数 或者 SystemRandom类。

Bookkeeping functions:

函数列表:

random.seed(a=None, version=2)

Initialize the random number generator.

初始化随机数生成器。

If a is omitted or None, the current system time is used. If randomness sources are provided by the operating system, they are used instead of the system time (see the os.urandom() function for details on availability).

如果参数a被省略或者是None,则使用当前的系统时间来作为种子。如果操作系统提供有随机源,它们将被使用,不使用系统时间(细节请参考os.urandom() 函数)。 

If a is an int, it is used directly.

如果参数a是一个整数,它将直接被拿来使用。

With version 2 (the default), a str, bytes, or bytearray object gets converted to an int and all of its bits are used. With version 1, the hash() of a is used instead.

version参数默认是2,str,bytes或者bytearray对象将使用它们的全部位转换为一个整数拿来使用,如果version是1,则使用hash(a)作为种子。

Changed in version 3.2: Moved to the version 2 scheme which uses all of the bits in a string seed.

3.2版本的改变:将使用字符串所有位做种子的方法移动到version=2的方案中。

random.getstate()

Return an object capturing the current internal state of the generator. This object can be passed to setstate() to restore the state.

返回一个捕获了当前生成器内部状态的 object 对象,这个object 对象可以传递给setstate()函数,把状态存储起来。

random.setstate(state)

state should have been obtained from a previous call to getstate(), and setstate() restores the internal state of the generator to what it was at the time getstate() was called.

setstate()函数存储 调用getstate() 时捕获的生成器状态 state,setstate()在使用时,必须先通过getstate() 函数获取生成器状态 state 。

random.getrandbits(k)

Returns a Python integer with k random bits. This method is supplied with the MersenneTwister generator and some other generators may also provide it as an optional part of the API. When available, getrandbits() enables randrange() to handle arbitrarily large ranges.

返回 一个随机的k位的python整数,这个方法由梅森扭曲算法提供,其他的生成器会将它作为API实现的一个可选部分。当该方法可用的时候, getrandbits() 函数使得 randrange()函数可以处理任意大的范围。

Functions for integers:

关于整数的函数 :

random.randrange(stop)
random.randrange(start, stop[, step])

Return a randomly selected element from range(start, stop, step). This is equivalent to choice(range(start, stop, step)), but doesn’t actually build a range object.

从  range(start, stop, step)函数返回一个随机的整数。这个函数等价于choice(range(start, stop, step)),但是却不产生range对象。

The positional argument pattern matches that of range(). Keyword arguments should not be used because the function may use them in unexpected ways.

位置参数的匹配和range()函数相同。关键字参数却不应该使用,因为函数可能会在意想不到的方面使用关键字。

Changed in version 3.2: randrange() is more sophisticated about producing equally distributed values. Formerly it used a style like int(random()*n) which could produce slightly uneven distributions.

3.2版本的改变: randrange()函数生成相等的分布值,使用更加复杂的算法。在以前,它使用int(random()*n)这样的方案,该方案产生的随机数分布有轻微的不均匀。

random.randint(a, b)

Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).

返回一个随机整数N,  a <= N <= b,等价于randrange(a, b+1)。

Functions for sequences:

关于序列的函数: 

random.choice(seq)

Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

从一个非空的序列seq中,返回一个随机的选项。如果seq参数是空序列,将抛出 IndexError。

random.shuffle(x[, random])

Shuffle the sequence x in place. The optional argument random is a 0-argument function returning a random float in [0.0, 1.0); by default, this is the function random().

适当的混乱序列x,可选的参数random是一个0参数的函数,它返回一个随机的 [0.0, 1.0)之间的浮点数,它就是random()函数。

Note that for even rather small len(x), the total number of permutations of x is larger than the period of most random number generators; this implies that most permutations of a long sequence can never be generated.

注意即使 len(x) 的值比较小,x的排列数总数也比随机数生成器的周期要大,这意味着大序列的很多排序结果根本不会产生。

random.sample(population, k)

Return a k length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement.

从一个序列或者集合中返回一个k个元素的列表 。用于无替换的随机抽样。

Returns a new list containing elements from the population while leaving the original population unchanged. The resulting list is in selection order so that all sub-slices will also be valid random samples. This allows raffle winners (the sample) to be partitioned into grand prize and second place winners (the subslices).

 在不改变原始母体样本的情况下,返回一个新的列表。结果列表按照的是选择的顺序排序,所有切片操作是可用的。这允许丢弃的进入有用的选项。????

Members of the population need not be hashable or unique. If the population contains repeats, then each occurrence is a possible selection in the sample.

母体样本的成员不需要保证 hashable 或者 唯一,如果样本包含重复的选项,每次出现都有可能被选择进入最终的结果。

To choose a sample from a range of integers, use an range() object as an argument. This is especially fast and space efficient for sampling from a large population: sample(range(10000000), 60).

 如果要从一个整数范围内选择一个整数样本,请使用rang对象来作为一个参数。使用sample(range(10000000), 60)这个方法,更加快速,更高效。

If the sample size is larger than the population size, a ValueError is raised.

如果抽样的数目比母体样本的数目还大,则抛出 ValueError。

The following functions generate specific real-valued distributions. Function parameters are named after the corresponding variables in the distribution’s equation, as used in common mathematical practice; most of these equations can be found in any statistics text.

下面的函数生成特殊的实数。 方程后面的参数都和通常的数学实践有一致的命名,许多这样的方程可以在统计学文本中找到。

random.random()

Return the next random floating point number in the range [0.0, 1.0).

返回一个 [0.0, 1.0)范围内的随机浮点数。

random.uniform(a, b)

Return a random floating point number N such that a <= N <= b for a <= b and b <= N <= a for b < a.

返回一个随机的浮点数N,如果 a <= b 则  a <= N <= b  如果b < a 则 b <= N <= a。

The end-point value b may or may not be included in the range depending on floating-point rounding in the equation a + (b-a) * random().

最后一个参数b包含还是不包含在结果的范围内取决于这个方程 a + (b-a) * random()

random.triangular(low, high, mode)

Return a random floating point number N such that low <= N <= high and with the specified mode between those bounds. The low and high bounds default to zero and one. The mode argument defaults to the midpoint between the bounds, giving a symmetric distribution.

返回一个随机的浮点数N, low <= N <= high,并且带有指定的模式。low和high的范围默认是0和1,mode参数的默认值是这个范围的中间点,给出一个对称分布。

random.betavariate(alpha, beta)

Beta distribution. Conditions on the parameters are alpha > 0 and beta > 0. Returned values range between 0 and 1.

random.expovariate(lambd)

Exponential distribution. lambd is 1.0 divided by the desired mean. It should be nonzero. (The parameter would be called “lambda”, but that is a reserved word in Python.) Returned values range from 0 to positive infinity if lambd is positive, and from negative infinity to 0 if lambd is negative.

random.gammavariate(alpha, beta)

Gamma distribution. (Not the gamma function!) Conditions on the parameters are alpha > 0 and beta > 0.

The probability distribution function is:

 x ** (alpha - 1) * math.exp(-x / beta) pdf(x) = -------------------------------------- math.gamma(alpha) * beta ** alpha 
random.gauss(mu, sigma)

Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.

random.lognormvariate(mu, sigma)

Log normal distribution. If you take the natural logarithm of this distribution, you’ll get a normal distribution with mean mu and standard deviation sigma. mu can have any value, and sigma must be greater than zero.

random.normalvariate(mu, sigma)

Normal distribution. mu is the mean, and sigma is the standard deviation.

random.vonmisesvariate(mu, kappa)

mu is the mean angle, expressed in radians between 0 and 2*pi, and kappa is the concentration parameter, which must be greater than or equal to zero. If kappa is equal to zero, this distribution reduces to a uniform random angle over the range 0 to 2*pi.

random.paretovariate(alpha)

Pareto distribution. alpha is the shape parameter.

random.weibullvariate(alpha, beta)

Weibull distribution. alpha is the scale parameter and beta is the shape parameter.

Alternative Generator:

可替换的生成器 :

class random.SystemRandom([seed])

Class that uses the os.urandom() function for generating random numbers from sources provided by the operating system. Not available on all systems. Does not rely on software state, and sequences are not reproducible. Accordingly, the seed() method has no effect and is ignored. The getstate() and setstate() methods raise NotImplementedError if called,并且序列是不可以再次产生的,

这个类使用 os.urandom()函数来从操作系统提供的源中产生随机数值, 并不是在所有的系统都可用,它不依赖于软件的状态。因此seed()函数是没有用的,被忽略的。getstate() 和 setstate() 函数如果被调用,将抛出 NotImplementedError。

See also

M. Matsumoto and T. Nishimura, “Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator”, ACM Transactions on Modeling and Computer Simulation Vol. 8, No. 1, January pp.3-30 1998.

Complementary-Multiply-with-Carry recipe for a compatible alternative random number generator with a long period and comparatively simple update operations.

9.6.1. Notes on Reproducibility 再现性

Sometimes it is useful to be able to reproduce the sequences given by a pseudo random number generator. By re-using a seed value, the same sequence should be reproducible from run to run as long as multiple threads are not running.

有时候,使用伪随机数生成器重新生成序列是有用的,。当多线程没有运行时,通过重新使用一个seed值,相同的序列应该可以反复生成。

Most of the random module’s algorithms and seeding functions are subject to change across Python versions, but two aspects are guaranteed not to change:

大多数的随机模块算法和种子函数服从于python版本的变化,但是有2各方面是绝对不会发生改变的:

1、If a new seeding method is added, then a backward compatible seeder will be offered.

如果一个新的种子方法被添加进来,则必须提供一个向后兼容的种子生成器。

2、The generator’s random() method will continue to produce the same sequence when the compatible seeder is given the same seed.

生成器的random() 方法将持续的生成同样的序列,当兼容的种子生成器提供相同的种子的时候。

9.6.2. Examples and Recipes

Basic usage:

>>> random.random()                      # Random float x, 0.0 <= x < 1.0

0.37444887175646646

>>> random.uniform(, )                # Random float x, 1.0 <= x < 10.0

1.1800146073117523

>>> random.randrange()                 # Integer from  to 

>>> random.randrange(, , )          # Even integer from  to 

>>> random.choice('abcdefghij')          # Single random element

'c'

>>> items = [, , , , , , ]

>>> random.shuffle(items)

>>> items

[, , , , , , ]

>>> random.sample([, , , , ],  )   # Three samples without replacement

[, , ]

A common task is to make a random.choice() with weighted probabilities.

一个更常见的任务是通过 random.choice() 函数,对加权的可能性,做一个随机的选择 

If the weights are small integer ratios, a simple technique is to build a sample population with repeats:

如果加权是一个小的比率,可以简单的通过重复值来建立一个抽样。

>>> weighted_choices = [('Red', 3), ('Blue', 2), ('Yellow', 1), ('Green', 4)]

>>> population = [val for val, cnt in weighted_choices for i in range(cnt)]

>>> random.choice(population)

'Green'

A more general approach is to arrange the weights in a cumulative distribution with itertools.accumulate(), and then locate the random value with bisect.bisect():

>>> choices, weights = zip(*weighted_choices)

>>> cumdist = list(itertools.accumulate(weights))

>>> x = random.random() * cumdist[-1]

>>> choices[bisect.bisect(cumdist, x)] 

'Blue'

Python标准库3.4.3-random的更多相关文章

  1. 【python标准库模块二】random模块学习

    random模块是用来生成随机数的模块 导入random模块 import random 生成一个0~1的随机数,浮点数 #随机生成一个0~1的随机数 print(random.random()) 生 ...

  2. python标准库总的random函数用法

    Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等.random中的一些重要函数的用法:1 ).random() 返回0& ...

  3. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

  4. Python标准库——走马观花

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...

  5. Python标准库概览

    Python标准库通常被称为"自带的电池",自然地提供了广泛的功能,涵盖了大概200个左右的包与模块.不断有高质量的包或模块被开发出来,极大的丰富了标准库.但有些模块放在标准库中很 ...

  6. python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结

    Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小 ...

  7. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  8. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  9. Python 标准库一览(Python进阶学习)

    转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...

  10. Python标准库 (pickle包,cPickle包)

    在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我提到过Python“一切皆对象”的哲学,在Python中,无论是变量还是函数,都是一个对象.当Python运行时,对象 ...

随机推荐

  1. ecshop怎么以幻灯版调用首页主广告显示

    今天在做一个商品网站我使用的是一套现成的ecshop模板了,这套模板下载下来多半是可以使用的,但是我发现第一屏的首页广告一直是不显示我想了很多办法都不显示了,后来一站长告诉我如何解决,下面我就来介绍e ...

  2. http post 自动变成了options 怎么设置

  3. Pyhon时间参数的应用

    Python获取 本周,上周,本月,上月,本季,上季,今年, 去年 # -*- coding: utf-8 -*-# @time: 2019-05-13 17:30 import datetime f ...

  4. .bashrc修改环境变量文件后ls之类的不能用了

    在命令行中输入 export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin之后在修改回来

  5. python scipy包进行GO富集分析p值计算

    最近总是有需要单独对某一个类型的通路进行超几何分布的p值计算,这里记录一下python包的计算方法 使用scipy的stat里面的hypergeom.sf方法进行富集分析的p值计算 hsaxxxxx ...

  6. 有助提升编程的几个Python 技巧

    一行代码定义List 定义某种列表时,写For 循环过于麻烦,幸运的是,Python有一种内置的方法可以在一行代码中解决这个问题. 下面是使用For循环创建列表和用一行代码创建列表的对比. x = [ ...

  7. netty-websocket简单的使用方法

    最便捷使用netty-websocket方法 1.pom添加依赖 <dependency> <groupId>org.yeauty</groupId> <ar ...

  8. 考试应对(Java语法速览)

    1.从命令行输入数据 格式:Scanner reader=new Scanner(System.in); 此reader对象可以使用的方法:nextBoolean(),nextByte(),nextS ...

  9. pandas之时间序列笔记

    时间戳tiimestamp:固定的时刻->pd.Timestamp 固定时期period:比如2016年3月份,再如2015年销售额->pd.Period 时间间隔interval:由起始 ...

  10. hdu 2539 虽然是水题 wa了很多次 说明自己的基本功不扎实 需要打好基础先 少年

    两点吧 1.gets使用的时候 确保上一次的回车符对其没有影响 getline也是如此 这样的细节..  多注意啊!! 2.编写程序的时候 对一些极端的情况要多调试 比如此题当 n==1的时候..  ...