随机数
在进行实验或者验证算法的时候,常常会需要使用“随机数”来模拟数据,而 NumPy 提供了许多产生随机数的方法,不仅可以单纯产生随机小数或整数,也可以根据几率分布的算法,例如常态分布、对数分布、beta 分布...等来产生随机数,这篇教学将会介绍 NumPy 的 random 模组。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
什么是随机数?
随机数也称作乱数,表示一串不规则的随机数字,在程序语言中,通常是透过一系列的算法来产生随机数,所以程序语言所产生的随机数也称作“伪随机数”,虽然看起来毫无规则,但只要知道对应的算法规则,就能够反推所产生的随机数。
如果要产生真正的随机数,通常会搭配一些外部来源 ( 例如键盘行为、网络数据、类比数据、背景辐射...等 ),但这往往只应用于安全性的验证或一些进阶的应用,在一般的状况下,只需要使用程序所提供的方法产生随机数,就能满足大部分随机数的需求。
NumPy 产生随机数的方法
NumPy 的 random 模组有下列几种产生随机数的方法:
| 方法 | 说明 |
|---|---|
| random.random() | 产生指定数量或维度的随机数 ( 0~1 之间的浮点数 )。 |
| random.random_sample() | 等同 random.random()。 |
| random.ranf() | 等同 random.random()。 |
| random.rand() | 产生指定数量或维度的随机数 ( 0~1 之间的浮点数 )。 |
| random.randn() | 产生指定数量或维度的随机数 ( 常态分布的浮点数 )。 |
| random.randint() | 产生指定数值范围与数量的随机整数。 |
| random.permutation() | 将原本的数组数据随机排列,产生新的数组。 |
| random.shuffle() | 将原本的数组数据随机排列,改变原本数组。 |
| random.choice() | 产生指定数量的一维数组随机整数。 |
| 随机数分布生成算法 | 列出 NumPy 提供的随机数分布算法。 |
random.random()
random.random() 能产生指定数量或维度的随机数 ( 0~1 之间的浮点数 )。
random.random_sample()、random.ranf() 的用法和 random.random() 完全相同。
from numpy import random
print(random.random()) # 0.4068905682640278
print(random.random(3)) # [0.61705999 0.1028753 0.00849189]
print(random.random((3,2))) # 二維陣列
'''
[[0.86175955 0.0851971 ] [0.23620749 0.61860973] [0.86944478 0.14515473]]
'''
print(random.random((3,2,2))) # 三維陣列
'''
[[[0.38583085 0.27966436] [0.62240807 0.83161681]]
[[0.79261711 0.68208243] [0.97840682 0.22284812]]
[[0.98196351 0.94917006] [0.69809127 0.74838828]]]
'''
random.rand()
random.rand() 能产生指定数量或维度的随机数 ( 0~1 之间的浮点数 )。
多维度的用法和 random.random() 在括号的表现上略有不同 ( random.rand() 少一层括号 ),其余用法相同。
from numpy import random
print(random.rand()) # 0.7005789765387292
print(random.rand(3)) # [0.741909 0.13810363 0.78651186] 一維陣列
print(random.rand(3,2)) # 二維陣列
'''
[[0.48278515 0.52290733] [0.04385542 0.58186165] [0.62436663 0.26051134]]
'''
print(random.rand(3,2,2)) # 三維陣列
'''
[[[0.50227547 0.14535769] [0.27471491 0.61848338]]
[[0.37914787 0.0053561 ] [0.12544604 0.10443339]]
[[0.42781305 0.70534284] [0.12455917 0.66684256]]]
'''
random.randn()
random.randn() 能产生指定数量或维度的随机数 ( 常态分布的浮点数 )。
from numpy import random
print(random.randn()) # 1.4421601737169842
print(random.randn(3)) # [-0.56459336 0.50494251 -0.33503292] 一維陣列
print(random.randn(3,2)) # 二維陣列
'''
[[-0.74830529 0.87249096] [-0.66611804 2.989516 ] [ 1.12876535 0.78771974]]
'''
print(random.randn(3,2,2)) # 三維陣列
'''
[[[ 0.68416542 -1.08254128] [-0.63780613 -0.34407012]]
[[-0.09775197 0.24545264] [ 0.44459631 0.29544603]]
[[ 2.50778709 1.11212665] [ 1.04983518 -0.94384928]]]
'''
random.randint()
random.randint() 能产生指定数值范围与数量的随机整数,参数有 low 最低数值、high 最高数值、size 数组尺寸,如果 low 和 high 只设定一个,另一个会自动使用 0。
from numpy import random
print(random.randint(10)) # 6,產生 0~10 的隨機整數
print(random.randint(10,size=3)) # [7 9 0],產生三個 0~10 的隨機整數
print(random.randint(-10,10,size=3)) # [ 7 -1 8],產生三個 -10~10 的隨機整數
print(random.randint(-10,10,size=(3,3))) # 產生 3x3 的陣列,元素為 -10~10 的隨機整數
'''
[[-4 3 -2]
[ 4 -4 7]
[-5 -2 -3]]
'''
random.permutation()
random.permutation() 会将原本的数组数据随机排列,产生新的数组,如果是多维数组,不会重排每个维度的元素,只会将第一个维度的项目重新排列。
from numpy import random
a = [1,2,3,4,5,6,7,8,9]
b = random.permutation(a)
print(b) # [8 2 7 5 6 1 3 4 9]
c = [[1,2,3],[4,5,6],[7,8,9]]
d = random.permutation(c) # 只重排第一個維度的項目[
print(d) # [[7 8 9] [1 2 3] [4 5 6]]
e = [[[1,2],[3,3]],[[4,5],[6,6]],[[7,8],[9,9]]]
f = random.permutation(e) # 只重排第一個維度的項目
print(f) # [[[4 5] [6 6]] [[1 2] [3 3]] [[7 8] [9 9]]]
random.shuffle()
random.shuffle() 会将原本的数组数据随机排列,改变原本的数组数据,如果是多维数组,不会重排每个维度的元素,只会将第一个维度的项目重新排列。
from numpy import random
a = [1,2,3,4,5,6,7,8]
b = [[1,2,3,4],[5,6,7,8]]
c = [[[1,2],[3,4]],[[5,6],[7,8]]]
random.shuffle(a)
random.shuffle(b)
random.shuffle(c)
print(a) # [6, 1, 7, 8, 3, 5, 4, 2]
print(b) # [[5, 6, 7, 8], [1, 2, 3, 4]]
# 只重排第一個維度的項目
print(c) # [[[5, 6], [7, 8]], [[1, 2], [3, 4]]]
# 只重排第一個維度的項目
random.choice()
random.choice() 会产生指定数量的一维数组随机整数,参数有 a ( 0~a 的整数区间或其他的数组数据 )、size 输出的数组大小,p 数组数据的几率分布 ( 加总为 1 ),replace 随机数是否重复 ( 默认 True )。
下方的最后一个例子,会根据 p 的几率设定,产生对应的随机数数组,由于原本数组的 d 出现几率设定为 0,所以产生的新数组中就不会出现 d 的字母,出现 b 的几率为 80%,出现 a 或 c 的几率各为 10%。
from numpy import random
# 產生十個一個 0~10 隨機整數
print(random.choice(10)) # 8
# 產生十個 0~10 隨機整數
print(random.choice(10,10)) # [5 6 9 6 3 7 1 6 5 1]
# 產生十個不重複的 0~10 隨機整數
print(random.choice(10,10, replace=False)) # [3 2 6 9 8 5 1 7 0 4]
# 根據機率產生十個 a、b、c、d 組合的隨機數陣列
print(random.choice(['a','b','c','d'],10, p=[0.1,0.8,0.1,0])) # ['c' 'a' 'b' 'b' 'b' 'b' 'b' 'b' 'b' 'b']
NumPy 随机数分布生成算法
下方整理了 NumPy 支援的随机数分布生成算法,透过特定的算法,就能产生特定范围与出现几率的随机数,方便应用于各种统计学的计算:
| 生成算法 | 中文名称 | 参考 |
|---|---|---|
| random.normal | 常态分布、高斯分布 | NumPy 官方文件、Wiki |
| random.standard_normal | 标准常态分布 | NumPy 官方文件 |
| random.power | 幂定律分布 | NumPy 官方文件、Wiki |
| random.beta | 贝它分布 | NumPy 官方文件、Wiki |
| random.gamma | 伽玛分布 | NumPy 官方文件、Wiki |
| random.binomial | 二项式分布 | NumPy 官方文件、Wiki |
| random.chisquare | 卡方分布 | NumPy 官方文件、Wiki |
| random.dirichlet | 狄利克雷分布 | NumPy 官方文件、Wiki |
| random.exponential | 指数分布 | NumPy 官方文件、Wiki |
| random.standard_exponential | 标准指数分布 | NumPy 官方文件 |
| random.f | F-分布 | NumPy 官方文件、Wiki |
| random.geometric | 几何分布 | NumPy 官方文件、Wiki |
| random.gumbel | 甘别分布 | NumPy 官方文件、Wiki |
| random.hypergeometric | 超几何分布 | NumPy 官方文件、Wiki |
| random.laplace | 拉普拉斯分布 | NumPy 官方文件、Wiki |
| random.logistic | 逻辑分布 | NumPy 官方文件、Wiki |
| random.lognormal | 对数常态分布 | NumPy 官方文件、Wiki |
| random.logseries | 对数分布 | NumPy 官方文件、Wiki |
| random.multinomial | 多项分布 | NumPy 官方文件、Wiki |
| random.multivariate_normal | 多元常态分布 | NumPy 官方文件、Wiki |
| random.negative_binomial | 负二项式分布 | NumPy 官方文件、Wiki |
| random.noncentral_chisquare | Noncentral chi-squared 分布 | NumPy 官方文件、Wiki |
| random.noncentral_f | Noncentral F 分布 | NumPy 官方文件、Wiki |
| random.pareto | 柏拉图分布 | NumPy 官方文件、Wiki |
| random.poisson | 卜瓦松分布 | NumPy 官方文件、Wiki |
| random.rayleigh | 瑞利分布 | NumPy 官方文件、Wiki |
| random.standard_cauchy | 标准柯西分布 | NumPy 官方文件、Wiki |
| random.standard_t | 司徒顿 t 分布 | NumPy 官方文件、Wiki |
| random.triangular | 三角形分布 | NumPy 官方文件、Wiki |
| random.uniform | 连续型均匀分布 | NumPy 官方文件、Wiki |
| random.vonmises | von Mises 分布 | NumPy 官方文件、Wiki |
| random.wald | 逆高斯分布 | NumPy 官方文件、Wiki |
| random.weibull | 韦伯分布 | NumPy 官方文件、Wiki |
| random.zipf | 齐夫定律分布 | NumPy 官方文件、Wiki |
微信扫码关注
抖音扫码关注