创建随机数数组
MATLAB® 使用算法来生成伪随机数和伪独立数。这些数在数学意义上并非严格随机和独立的,但它们能够通过各种随机和独立统计测试,并且其计算可以重复,方便用于测试或诊断目的。
rand
、randi
、randn
和 randperm
函数是创建随机数数组的主要函数。rng
函数允许您控制生成随机数的种子和算法。
随机数函数
有四种基本随机数函数:rand
、randi
、randn
和 randperm
。rand
函数返回在 0 和 1 之间均匀分布的浮点数。例如,创建一个含有均匀分布浮点实数的 1000 x 1 的列向量。
rng("default")
r1 = rand(1000,1);
r1
中的所有值均处于开区间 (0,1) 内。这些值的直方图大致上是扁平形状,这表明采样数相当均匀。randi
函数返回离散均匀分布中的 double
整数值。例如,创建一个 1000×1 列向量,其中包含从离散均匀分布中提取的整数值。
r2 = randi(10,1000,1);
r2
中的所有值都在闭区间 [1, 10] 内。这些值的直方图大致上是扁平形状,这表明从 1 到 10 之间采样数相当均匀。 randn
函数返回标准正态分布中的浮点实数数组。例如,创建一个含有标准正态分布数的 1000×1 的列向量。
r3 = randn(1000,1);
r3
的直方图看似大致上均值为 0 且标准差为 1 的正态分布。可以使用 randperm
函数创建一个由没有重复值的随机整数值组成的 double
数组。例如,创建一个 1×5 数组,包含从范围 [1, 15] 中随机选择的整数。
r4 = randperm(15,5);
randi
不同,randperm
返回的数组没有重复值。接连调用上述任一函数均可返回不同的结果。这种特性适合用于创建几个不同的随机值数组。
随机数生成器
MATLAB 提供几个生成器算法选项,下表对其进行了总结。
值 | 生成器名称 | 生成器关键字 |
---|---|---|
"twister" | 梅森旋转 | mt19937ar |
"simdTwister" | 面向 SIMD 的快速梅森旋转算法 | dsfmt19937 |
"combRecursive" | 组合多递归 | mrg32k3a |
"multFibonacci" | 乘法滞后斐波那契 | mlfg6331_64 |
"philox" | 执行 10 轮的 Philox 4×32 生成器 | philox4x32_10 |
"threefry" | 执行 20 轮的 Threefry 4×64 生成器 | threefry4x64_20 |
"v4" | MATLAB 4.0 版旧生成器 | mcg16807 |
"v5uniform" | MATLAB 5.0 版旧式均匀随机数生成器 | swb2712 |
"v5normal" | MATLAB 5.0 版旧式正态分布随机数生成器 | shr3cong |
使用 rng
函数可设置 rand
、randi
、randn
和 randperm
函数使用的种子和生成器。
例如,rng(0,"twister")
将种子设置为 0,将生成器算法设置为梅森旋转。要避免在 MATLAB 重新启动时重复随机数数组,请参阅随机数为什么可在启动后重复出现?。
有关控制随机数生成器的状态以使用相同的随机数重复计算或保证在重复计算中使用不同随机数的详细信息,请参阅控制随机数的生成。
您可以在 MATLAB 预设项中设置默认算法和种子 (自 R2023b 起)。如果您不更改这些预设项设置,则与以前的版本一样,rng
将使用种子为 0 的梅森旋转生成器的出厂值 "twister"
。有关详细信息,请参阅 随机数生成器的默认设置 和 随机数生成器的可再现性。
随机数的数据类型
rand
和 randn
函数默认情况下会生成双精度类型的值。
rng("default")
A = rand(1,5);
class(A)
ans = 'double'
要将类显式指定为双精度类型:
rng("default") B = rand(1,5,"double"); class(B)
ans = 'double'
isequal(A,B)
ans = 1
rng("default") A = rand(1,5,"single"); class(A)
ans = 'single'
这些值与转换前一示例中的双精度值相同。无论返回哪种类的值,这些函数获取的随机流都会以相同方式增加。
A,B
A = 0.8147 0.9058 0.1270 0.9134 0.6324 B = 0.8147 0.9058 0.1270 0.9134 0.6324
randi
既支持整数类型,又支持单精度或双精度类型。
A = randi([1 10],1,5,"double");
class(A)
ans = 'double'
B = randi([1 10],1,5,"uint8");
class(B)
ans = 'uint8'
另请参阅
rng
| rand
| randi
| randn
| randperm