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. gen语言

    概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴.在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案.最近,麻省理工学院(MIT)的研究人员推出了一 ...

  2. mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型

    mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型 ,代码肯定省事的呀 --添加表列 alter table test ) null; --删除表列 alter table tes ...

  3. 【GStreamer开发】GStreamer播放教程09——数字音频传输

    目标 本教程展示GStreamer是如何进行数字音频传输的. 介绍 在常见的模拟格式外,高端的音频系统通常都接受数字格式,压缩的非压缩的都能接受.因为音频信号是从电脑传到音箱,用一种更有弹性的形态会更 ...

  4. 实现不同分辨率、不同浏览器下高度自适应、iframe高度自适应

    html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  5. git使用mvn clean install 报错原因排查

    使用命令行git-bath.exe 来拉代码并进行编译之类的服务,结果在拉依赖时一直报错连的是144.131.254.26,看了maven的setting配置 文件 没并没有错, 最终定位问题是 gi ...

  6. 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]

    1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...

  7. 软件包 javax.naming了解

    Context  此接口表示一个命名上下文,它由一组名称到对象的绑定组成. Name  Name 接口表示一个一般名称,即一个有序的组件序列. NameParser  此接口用于解析取自分层的名称空间 ...

  8. 【统计与建模】R语言基本操作

    # vec <- rep( seq(1,5,by=0.5),3) # vec <- seq( 1 , 10 , by = 1 ) # min(vec) #最小值 # max(vec) #最 ...

  9. Kafka 的这些原理你知道吗

    如果只是为了开发 Kafka 应用程序,或者只是在生产环境使用 Kafka,那么了解 Kafka 的内部工作原理不是必须的.不过,了解 Kafka 的内部工作原理有助于理解 Kafka 的行为,也利用 ...

  10. CF858F Wizard's Tour

    也许更好的阅读体验 \(\mathcal{Description}\) 给定一张 \(n\) 个点 \(m\) 条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通. 你想在这张图上进行若干次 ...