Main Content

randn

正态分布的随机数

说明

X = randn 返回一个从标准正态分布中得到的随机标量。

示例

X = randn(n) 返回由正态分布的随机数组成的 n×n 矩阵。

示例

X = randn(sz1,...,szN) 返回由随机数组成的 sz1×...×szN 数组,其中 sz1,...,szN 指示每个维度的大小。例如:randn(3,4) 返回一个 3×4 的矩阵。

示例

X = randn(sz) 返回由随机数组成的数组,其中大小向量 sz 定义 size(X)。例如:randn([3 4]) 返回一个 3×4 的矩阵。

示例

X = randn(___,typename) 返回由 typename 数据类型的随机数组成的数组。typename 输入可以是 "single""double"。您可以使用上述语法中的任何输入参量。

示例

X = randn(___,"like",p) 返回一个与 p 类似的由随机值组成的数组,它具有与 p 相同的数据类型和复/实性(实数或复数)。您可以指定 typename"like",但不能同时指定两者。

X = randn(s,___) 从随机数流 s 而不是默认全局流生成数字。要创建一个流,请使用 RandStream。您可以指定 s,后跟上述语法中的任何输入参量组合。

示例

全部折叠

生成一个由正态分布的随机数组成的 5×5 矩阵。

r = randn(5)
r = 5×5

    0.5377   -1.3077   -1.3499   -0.2050    0.6715
    1.8339   -0.4336    3.0349   -0.1241   -1.2075
   -2.2588    0.3426    0.7254    1.4897    0.7172
    0.8622    3.5784   -0.0631    1.4090    1.6302
    0.3188    2.7694    0.7147    1.4172    0.4889

通过指定的平均向量和协方差矩阵基于二元正态分布生成值。

mu = [1 2];
sigma = [1 0.5; 0.5 2];
R = chol(sigma);
z = repmat(mu,10,1) + randn(10,2)*R
z = 10×2

    1.5377    0.4831
    2.8339    6.9318
   -1.2588    1.8302
    1.8622    2.3477
    1.3188    3.1049
   -0.3077    1.0750
    0.5664    1.6190
    1.3426    4.1420
    4.5784    5.6532
    3.7694    5.2595

保存随机数生成器的当前状态并创建一个由随机数组成的 1×5 向量。

s = rng;
r = randn(1,5)
r = 1×5

    0.5377    1.8339   -2.2588    0.8622    0.3188

将随机数生成器的状态恢复为 s,然后创建一个由随机数组成的新 1×5 向量。值与之前相同。

rng(s);
r1 = randn(1,5)
r1 = 1×5

    0.5377    1.8339   -2.2588    0.8622    0.3188

创建一个由随机数组成的 3×2×3 数组。

X = randn([3,2,3])
X = 
X(:,:,1) =

    0.5377    0.8622
    1.8339    0.3188
   -2.2588   -1.3077


X(:,:,2) =

   -0.4336    2.7694
    0.3426   -1.3499
    3.5784    3.0349


X(:,:,3) =

    0.7254   -0.2050
   -0.0631   -0.1241
    0.7147    1.4897

创建一个由其元素为单精度值的随机数组成的 1×4 向量。

r = randn(1,4,"single")
r = 1x4 single row vector

    0.5377    1.8339   -2.2588    0.8622

class(r)
ans = 
'single'

创建一个由正态分布的随机数组成并且大小与现有数组相同的矩阵。

A = [3 2; -2 1];
sz = size(A);
X = randn(sz)
X = 2×2

    0.5377   -2.2588
    1.8339    0.8622

通常可以将前两行代码合并成一行:

X = randn(size(A));

创建一个由单精度随机数组成的 2×2 矩阵。

p = single([3 2; -2 1]);

创建一个与 p 具有相同大小和数据类型的由随机数组成的数组。

X = randn(size(p),"like",p)
X = 2x2 single matrix

    0.5377   -2.2588
    1.8339    0.8622

class(X)
ans = 
'single'

自 R2022a 起

从标准复数正态分布生成 10 个随机复数。

a = randn(10,1,"like",1i)
a = 10×1 complex

   0.3802 + 1.2968i
  -1.5972 + 0.6096i
   0.2254 - 0.9247i
  -0.3066 + 0.2423i
   2.5303 + 1.9583i
  -0.9545 + 2.1460i
   0.5129 - 0.0446i
   0.5054 - 0.1449i
  -0.0878 + 1.0534i
   0.9963 + 1.0021i

自 R2022a 起

默认情况下,randn(__,"like",1i) 根据标准复数正态分布生成随机数。实部和虚部是独立正态分布随机变量,均值为 0,方差为 1/2。二维随机变量 z=[Re(z),Im(z)] 的协方差矩阵是 [1/2 0; 0 1/2]。为了显示此默认行为,使用 randn 生成 50,000 个随机数并计算其协方差。

n = 50000;
z = randn(n,1,"like",1i);
cov_z = cov(real(z),imag(z),1)
cov_z = 2×2

    0.4980    0.0007
    0.0007    0.4957

要从具有特定均值和协方差的更一般的复数正态分布生成随机数,请变换从默认分布生成的数据。对于遵循具有零均值和单位协方差矩阵的正态分布的 N 维随机变量 z=[z1,z2,,zN],您可以将 z 变换为 y=μ+zR。变量 y 遵循均值为 μ 且协方差矩阵 σ=RTR 为对称正定的正态分布。例如,将均值指定为 μ=1+2i,将协方差矩阵指定为 σ=[σxxσxyσyxσyy]=[2-2-24]

mu = 1 + 2i;
sigma = [2 -2; -2 4];

执行协方差矩阵的乔列斯基分解。结果是上三角矩阵 R,满足 sigma = R'*R。由于原始分布中实部和虚部的方差为 1/2,因此也可以通过应用因子 sqrt(2) 来缩放原始数据。然后,将缩放后的数据加上指定的均值。

R = chol(sigma);
z_scaled = sqrt(2)*[real(z) imag(z)]*R*[1; 1i];
y = mu + z_scaled;

显示前 10 个生成的复数。

y(1:10)
ans = 10×1 complex

   1.7604 + 3.8331i
  -2.1945 + 6.4138i
   1.4508 - 0.3002i
   0.3868 + 3.0977i
   6.0606 + 0.8560i
  -0.9090 + 8.2011i
   2.0259 + 0.8850i
   2.0108 + 0.6993i
   0.8244 + 4.2823i
   2.9927 + 2.0115i

输入参数

全部折叠

方阵的大小,指定为整数值。

  • 如果 n0,则 X 为一个空矩阵。

  • 如果 n 为负数,则将其视为 0

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

每个维度的大小,指定为包含整数值的单独参量。

  • 如果任一维度的大小为 0,则 X 为空数组。

  • 如果任何维度的大小为负值,则其将被视为 0

  • 对于第二个维度以上的维度,randn 忽略大小为 1 的尾部维度。例如,randn(3,1,1,1) 生成由随机数组成的 3×1 向量。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

每个维度的大小,指定为由整数组成的行向量。此向量的每个元素指示对应维度的大小:

  • 如果任一维度的大小为 0,则 X 为空数组。

  • 如果任何维度的大小为负值,则其将被视为 0

  • 对于第二个维度以上的维度,randn 忽略大小为 1 的尾部维度。例如,randn([3 1 1 1]) 生成由随机数组成的 3×1 向量。

示例: sz = [2 3 4] 创建一个 2×3×4 数组。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

要创建的数据类型(类),指定为 "double""single" 或提供 randn 支持的其他类的名称。

示例: randn(5,"single")

要创建的数组的原型,指定为数值数组。

示例: randn(5,"like",p)

数据类型: single | double
复数支持:

随机数流,指定为 RandStream 对象。

示例: s = RandStream("dsfmt19937"); randn(s,[3 1])

详细信息

全部折叠

标准实数和标准复数正态分布

生成随机实数时,randn 函数生成遵循标准正态分布的数据:

f(x)=12πex2/2.

此处,x 是均值为 0、方差为 1 的随机实数变量。

当生成随机复数时,例如当使用命令 randn(...,"like",1i) 时,randn 函数生成遵循标准复数正态分布的数据:

f(z)=1πe|z|2.

此处,z 是一个随机复变量,其实部和虚部是独立正态分布的随机变量,均值为 0、方差为 1/2。

提示

  • randn 生成的数字序列由均匀伪随机数生成器的内部设置决定,该生成器是 randrandirandn 的基础。您可以使用 rng 控制这一共享的随机数生成器。

扩展功能

版本历史记录

在 R2006a 之前推出

全部展开