zoukankan      html  css  js  c++  java
  • Python标准库3.4.3random

    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(110)                # Random float x, 1.0 <= x < 10.0
    1.1800146073117523

    >>> random.randrange(10)                 # Integer from 0 to 9
    7

    >>> random.randrange(01012)          # Even integer from 0 to 100
    26

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

    >>> items = [1234567]
    >>> random.shuffle(items)
    >>> items
    [7325641]

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

    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'

  • 相关阅读:
    关于图像分类问题读后感
    IO 输入流操作
    BP(back propagation)反向传播
    初识C++的类
    【转】贾扬清:希望Caffe成为深度学习领域的Hadoop
    转:谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版
    cmd命令行给main传参数
    把vector中的string对象导入到字符指针数组中
    转:字符数组与字符指针
    MHI ,运动历史图像的的获取[下载自CSDN]
  • 原文地址:https://www.cnblogs.com/tosee/p/4598236.html
Copyright © 2011-2022 走看看