random(随机数)

random(随机数)

Python的random库是用于生成随机数的标准库。它提供了各种功能,可以产生伪随机数、随机选择元素、打乱序列等。

import random

该模块实现了各种分布的伪随机数生成器。

对于整数,从范围中有统一的选择。 对于序列,存在随机元素的统一选择、用于生成列表的随机排列的函数、以及用于随机抽样而无需替换的函数。

在实数轴上,有计算均匀、正态(高斯)、对数正态、负指数、伽马和贝塔分布的函数。 为了生成角度分布,可以使用 von Mises 分布。

几乎所有模块函数都依赖于基本函数 random(),它在左开右闭区间 0.0 <= X < 1.0 内均匀生成随机浮点数。 Python 使用 Mersenne Twister 作为核心生成器。 它产生 53 位精度的浮点数并且周期为 2**19937-1。 其在 C 中的这个底层实现既快速又线程安全。 Mersenne Twister 是目前经过最广泛测试的随机数生成器之一。 但是,因为是完全确定性的,它不适用于所有目的,并且完全不适用于加密目的。

警告:不应将此模块的伪随机生成器用于安全目的。


1. 簿记功能

1.1 初始化种子

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

    **初始化随机数生成器。**即,用于设置随机数生成器的种子。种子是一个用于初始化随机数生成器的整数或字节序列。通过设置相同的种子,可以确保每次运行程序时生成的随机数序列是相同的,从而实现可重复的随机性。

    • a:种子值,可以是整数或字节序列。如果未提供种子值(即a=None),则使用系统时间作为种子。
      • 如果 a 是 int 类型,则直接使用。
        • 对于版本2(默认的),strbytesbytearray 对象转换为 int 并使用它的所有位。
        • 对于版本1(用于从旧版本的Python再现随机序列),用于 strbytes 的算法生成更窄的种子范围。
    • version:指定随机数生成器的版本。默认值为2。
    random.seed(version=5)
    

1.2 捕获当前种子ID

  • random.getstate()

    返回捕获生成器当前内部状态的对象。 这个对象可以传递给 setstate() 来恢复状态。

    • getstate()函数没有参数,调用它将返回一个表示当前随机数生成器状态的元组。这个元组包含了生成随机数所需的所有信息,包括种子值、内部状态等。
    import random
    
    # 获取当前随机数生成器的状态
    state = random.getstate()
    
    # 生成一些随机数
    random_number1 = random.randint(1, 100)
    random_number2 = random.random()
    
    # 恢复随机数生成器的状态
    random.setstate(state)
    
    # 生成相同的随机数
    restored_random_number1 = random.randint(1, 100)
    restored_random_number2 = random.random()
    
    # 打印结果
    print(random_number1)           # 随机数1
    print(random_number2)           # 随机数2
    print(restored_random_number1)  # 恢复后的随机数1,与random_number1相同
    print(restored_random_number2)  # 恢复后的随机数2,与random_number2相同
    

    18
    0.7057776752277172
    18
    0.7057776752277172


1.3 回档至某种子ID

  • random.setstate(state)

    state 应该是从之前调用 getstate() 获得的,并且 setstate() 将生成器的内部状态恢复到 getstate() 被调用时的状态。


2. 用于字节数据的函数

  • random.randbytes(n)

    生成 n 个随机字节。

    此方法不可用于生成安全凭据。 那应当使用 secrets.token_bytes()

    random.randbytes(3)
    

    b’!i\xbf’

3. 整数用函数

  • random.randrange(start, stop=None, step=1)

    用于生成一个指定范围内的随机整数。

    这大致等价于 choice(range(start, stop, step)) 但是支持任意大的取值范围并针对常见场景进行了优化。

    • start:生成随机整数的起始值(包含在范围内)。

      # 生成 0 到 9 之间的随机整数
      random.randrange(10)
      

      5

    • stop:生成随机整数的结束值(不包含在范围内)。如果未提供此参数,则默认为 None,此时生成的随机整数范围为 0 到 start

      # 生成 1 到 10 之间的随机整数
      random.randrange(1, 11)
      

      8

    • step:生成随机整数的步长,默认为 1。

      # 生成 0 到 100 之间的偶数
      random.randrange(0, 101, 2)
      

      74


  • random.randint(a, b)

    返回随机整数 N 满足 a <= N <= b。相当于 randrange(a, b+1)

    • a:生成随机整数的下界(包含在范围内)。
    • b:生成随机整数的上界(包含在范围内)。
    random.randint(1,5)
    

    5


  • random.getrandbits(k, /)

    用于生成一个具有 k 个随机比特位的非负 Python 整数。在 3.9 版本后,此方法现在接受零作为 k 的值。

    random.getrandbits(8)
    

    241

4. 序列用函数

4.1 抽取单个样品

  • random.choice(seq)

    从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError

    • seq:表示一个序列,可以是列表、元组、字符串等可迭代对象。
    random.choice(
      ['apple', 'banana', 'orange', 'grape', 'kiwi']
    )
    

    ‘apple’

4.2 有放回地随机抽样

  • random.choices(population, weights=None, *, cum_weights=None, k=1)

    用于从给定的总体(population)中进行有放回地进行随机抽样,返回一个包含指定数量元素的列表。 如果 population 为空,则引发 IndexError

    • population:表示总体,可以是一个可迭代对象(如列表、元组、字符串),或是一个整数 n,表示从范围 range(n) 中进行抽样。
    • weights(可选):表示每个元素的权重,可以是一个与 population 具有相同长度的可迭代对象,或是一个数字。默认情况下,所有元素的权重相等。
    • cum_weights(可选):与 weights 相同长度的累积权重列表,用于快速计算抽样结果。如果提供了 cum_weights,则忽略 weights 参数。
    • k(可选):表示要进行抽样的元素数量,默认为 1。

    函数返回一个包含抽样结果的列表,列表的长度为 k

    random.choices(
      ['apple', 'banana', 'orange', 'grape', 'kiwi'],
      weights=[2, 3, 1, 4, 2],
      k=3
    )
    

    [‘grape’, ‘banana’, ‘banana’]


4.3 随机打乱序列

  • random.shuffle(x, random=None)

    就地将序列 x 随机打乱位置。

    要改变一个不可变的序列并返回一个新的打乱列表,请使用 sample(x, k=len(x))

    该函数有两个参数:

    • x:表示要打乱顺序的序列,可以是一个可变序列(如列表)。
    • random(可选):表示一个可调用对象,用于生成随机数。如果未提供该参数,则使用默认的随机数生成器。

    函数会直接修改序列 x,将其中的元素随机打乱顺序,不返回任何结果。

    random.shuffle(
    	[1, 2, 3, 4, 5]
    )
    

    [3, 5, 1, 4, 2]


4.4 无放回地随机抽样

  • random.sample(population, k, *, counts=None)

    用于从给定的总体(population)中进行无放回地进行随机抽样,返回一个包含指定数量元素的列表。

    该函数有以下参数:

    • population:表示总体,可以是一个可迭代对象(如列表、元组、字符串),或是一个整数 n,表示从范围 range(n) 中进行抽样。
    • k:表示要进行抽样的元素数量。
    • counts(可选):一个整数或一个与 population 具有相同长度的可迭代对象,指定每个元素的数量。默认情况下,所有元素的数量为 1。

    函数返回一个包含抽样结果的列表,列表的长度为 k

    random.sample(
      ['apple', 'banana', 'orange', 'grape', 'kiwi'],
      k=3,
      counts=[9, 1, 1, 1, 1]
    )
    

    [‘apple’, ‘apple’, ‘apple’]

    重复的元素可以一个个地直接列出,或使用可选的仅限关键字形参 counts 来指定。 例如,sample(['red', 'blue'], counts=[4, 2], k=5) 等价于 sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)

    要从一系列整数中选择样本,请使用 range() 对象作为参数。 对于从大量人群中采样,这种方法特别快速且节省空间:sample(range(10000000), k=60)

    如果样本大小大于总体大小,则引发 ValueError

    在 3.9 版本发生变更: 增加了 counts 形参。


5. 实值分布

以下函数生成特定的实值分布。如常用数学实践中所使用的那样,函数形参以分布方程中的相应变量命名,大多数这些方程都可以在任何统计学教材中找到。


5.1 随机概率

  • random.random()

    用于生成一个位于 [0, 1) 范围内的随机浮点数。

    该函数无需参数,每次调用都会返回一个位于 [0, 1) 范围内的随机浮点数。

    random.random()
    

    0.06843809869654183

    每次调用 random.random() 都会返回一个不同的随机浮点数,该函数多用于需要生成随机概率或进行概率计算的场景中。


5.2 指定范围

  • random.uniform(a, b)

    返回一个位于指定范围 [a, b] 内的随机浮点数 N ,当 a <= ba <= N <= b ,当 b < ab <= N <= a

    注意:当 ab 的值非常接近时,由于浮点数的精度限制,生成的随机数可能会包括或不包括 b 这个终点值,具体取决于表达式 a + (b - a) * random() 的浮点舍入结果。

    random.uniform(9.9, 1)
    

    7.6930341099128405


5.3 三角分布

  • random.triangular(low=0.0, high=1.0, mode=None)

    返回一个三角分布(triangular distribution)内的随机浮点数 N ,使得 low <= N <= high 并在这些边界之间使用指定的 modelowhigh 边界默认为零和一。mode 参数默认为边界之间的中点,给出对称分布。

    • low:表示分布的下界。
    • high:表示分布的上界。
    • mode(可选):表示分布的峰值,即最可能出现的值。如果未提供该参数,默认值为中点 (low + high) / 2
    random.triangular(0.0, 1.0, 0.5)
    

    0.28521446404960693

    该函数多用于需要生成符合三角分布的随机数的场景中。


5.4 Beta 分布

Beta 分布是一种连续概率分布,其形状由参数 alphabeta 决定。它的取值范围在区间 [0, 1] 内。

  • random.betavariate(alpha, beta)

    参数的条件是 alpha > 0beta > 0。 返回值的范围介于 0 和 1 之间。

    • alpha:表示 Beta 分布的第一个形状参数(shape parameter)。
    • beta:表示 Beta 分布的第二个形状参数(shape parameter)。

    函数会基于给定的参数生成一个服从 Beta 分布的随机浮点数,并返回该随机数。

    random.betavariate(2, 5)
    

    0.14073565022070164

    该函数多用于需要生成符合 Beta 分布的随机数的场景中,例如用于模拟随机概率或进行概率计算。


5.5 指数分布

**指数分布是一种连续概率分布,常用于模拟表示随机事件之间时间间隔的随机变量。**它的概率密度函数(probability density function)为 lambd * exp(-lambd * x),其中 x 为随机变量的取值。

  • random.expovariate(lambd)

    lambd 是 1.0 除以所需的平均值,它应该是非零的。 如果 lambd 为正,则返回值的范围为 0 到正无穷大;如果 lambd 为负,则返回值从负无穷大到 0。

    • lambd:表示指数分布的参数,也称为率参数(rate parameter)或衰减参数(decay parameter)。它是一个正数,表示单位时间内事件发生的平均次数。(该参数本应命名为 “lambda” ,但这是 Python 中的保留字。)

    函数会基于给定的 lambd 参数生成一个服从指数分布的随机浮点数,并返回该随机数。

    random.expovariate(0.5)
    

    6.39915315576473

    该函数多用于需要生成服从指数分布的随机数的场景中,例如在模拟排队、网络传输等随机事件的时间间隔。


5.6 Gamma 分布

**伽玛分布是一种连续概率分布,它的形状由参数 alpha 和尺度由参数 beta 决定。**它在实际应用中常用于建模正偏斜(right-skewed)的数据分布。

  • random.gammavariate(alpha, beta)

    (不是 gamma 函数!) shape 和 scale 形参,即 alphabeta,必须为正值。 (调用规范有变动并且有些源码会将 ‘beta’ 定义为逆向的 scale)。

    概率分布函数是:

              x ** (alpha - 1) * math.exp(-x / beta)
    pdf(x) =  --------------------------------------
                math.gamma(alpha) * beta ** alpha
    
    • alpha:表示伽玛分布的形状参数(shape parameter)。
    • beta:表示伽玛分布的尺度参数(scale parameter)。
    random.gammavariate(2, 3)
    

    4.231543998685352

    该函数多用于需要生成服从伽玛分布的随机数的场景中,例如在风险分析、可靠性工程、金融建模等领域。


5.7 高斯分布

高斯分布是一种连续概率分布,其形状呈钟形曲线,以均值为中心对称。大部分的数据点分布在均值附近,随着距离均值的增加,数据点的概率逐渐减小。

  • random.gauss(mu, sigma)

    • mu:表示高斯分布的均值(mean)。
    • sigma:表示高斯分布的标准差(standard deviation)。

    函数会基于给定的参数生成一个服从高斯分布的随机浮点数,并返回该随机数。

    random.gauss(0, 1)
    

    1.3007577675850523

    该函数多用于需要生成服从高斯分布的随机数的场景中,例如在统计建模、模拟实验、数据生成等方面。

    注意:random.gauss(mu, sigma) 函数**生成的是近似服从高斯分布的随机数,而不是完全的高斯分布。**如果需要更精确的高斯分布随机数生成,可以使用第三方库,如 NumPy。


5.8 对数正态分布

对数正态分布是一种连续概率分布,它的形状呈右偏斜(right-skewed)的曲线。它的概率密度函数(probability density function)与正态分布的概率密度函数之间存在关联。

  • random.lognormvariate(mu, sigma)

    • mu:表示对数正态分布的均值的自然对数(natural logarithm of the mean)。
    • sigma:表示对数正态分布的标准差。

    函数会基于给定的参数生成一个服从对数正态分布的随机浮点数,并返回该随机数。

    random.lognormvariate(0, 1)
    

    0.1754746230005146

    该函数多用于需要生成服从对数正态分布的随机数的场景中,例如在金融领域、可靠性工程等方面。

    注意:**生成的随机数是对数正态分布的变量,而不是对数值。**如果需要对数值,可以使用 math.exp() 函数将其指数化。

    import random
    import math
    
    log = random.lognormvariate(0, 1)  # 生成对数正态分布的随机数
    exp = math.exp(log)  # 将对数值指数化
    
    print(log)
    print(exp)
    

    0.7737669840052342
    2.167917401701035


5.9 正态分布

正态分布是一种连续概率分布,其形状呈钟形曲线,以均值为中心对称。大部分的数据点分布在均值附近,随着距离均值的增加,数据点的概率逐渐减小。

  • random.normalvariate(mu, sigma)

    • mu:表示正态分布的均值(mean)。
    • sigma:表示正态分布的标准差(standard deviation)。

    函数会基于给定的参数生成一个服从正态分布的随机浮点数,并返回该随机数。

    random.normalvariate(0, 1)
    

    -1.9032845189309575

    该函数多用于需要生成服从正态分布的随机数的场景中,例如在统计建模、模拟实验、数据生成等方面。

    random.normalvariate(mu, sigma) 函数**生成的是近似服从正态分布的随机数,而不是完全的正态分布。**如果需要更精确的正态分布随机数生成,可以使用第三方库,如 NumPy。


5.10 冯·米塞斯分布

**von Mises 分布是一种连续概率分布,用于建模在圆周上的随机变量。**它通常用于表示方向性数据,如地理方向、天文方向等。von Mises 分布在统计学和概率论中具有重要的应用。

  • random.vonmisesvariate(mu, kappa)

    • mu:表示 von Mises 分布的平均角度(mean angle)。
    • kappa:表示 von Mises 分布的集中度(concentration)。

    函数会基于给定的参数生成一个服从 von Mises 分布的随机浮点数,并返回该随机数。

    random.vonmisesvariate(0, 1)
    

    0.2585829251109295


5.11 帕累托分布

**Pareto 分布是一种连续概率分布,它以帕累托原理(Pareto principle)命名。Pareto 分布具有长尾特征,即它的概率密度函数在尾部衰减缓慢。**它通常用于描述具有幂律分布的现象,例如财富分布、城市人口分布等。

  • random.paretovariate(alpha)

    • alpha:表示 Pareto 分布的形状参数(shape parameter),也称为 Pareto 指数。

    函数会基于给定的参数生成一个服从 Pareto 分布的随机浮点数,并返回该随机数。

    random.paretovariate(2)
    

    1.9497962897818355


5.12 威布尔分布

Weibull 分布是一种连续概率分布,常用于模拟具有不同可靠性特征的事件的发生时间。它的形状可以随着形状参数 alpha 的变化而改变,可以是指数分布、正态分布或右偏斜分布的特例。

  • random.weibullvariate(alpha, beta)

    • alpha:表示 Weibull 分布的形状参数(shape parameter)。
    • beta:表示 Weibull 分布的尺度参数(scale parameter)。

    函数会基于给定的参数生成一个服从 Weibull 分布的随机浮点数,并返回该随机数。

    random.weibullvariate(2 ,1)
    

    0.9068611766875241

你可能感兴趣的:(python)