创建随机数数组
R2026bMATLAB® 使用确定性算法生成伪随机数。这些数在数学意义上并非真正随机且独立,但它们能够通过随机性和独立性的统计检验,并且您可以为检验或诊断目的重现随机数序列。
rand、randi、randn 和 randperm 函数是创建随机数数组的主要函数。rng 函数允许您控制生成随机数的种子和算法。
生成随机数
您可以使用 rand、randi、randn 和 randperm 函数生成遵循不同类型分布的随机数。rand 函数生成在 0 和 1 之间均匀分布的随机浮点数。例如,创建一个含有均匀分布浮点实数的 10,000×1 的列向量。
rng("default")
n = 10000;
r1 = rand(n,1);r1 中的所有值均处于开区间 (0,1) 内。绘制这些值的直方图。直方图大致平坦,表明这些值的样本遵循某种均匀分布。histogram(r1) xlabel("Value") ylabel("Counts") title("Histogram of rand(" + n + ",1)")
randi 函数生成从离散均匀分布中抽取的随机 double 整数值。例如,创建一个 10,000×1 列向量,其中包含从离散均匀分布中抽取的闭区间 [1,10] 内的整数值。
n = 10000; r2 = randi(10,n,1);
histogram(r2) xlabel("Value") ylabel("Counts") title("Histogram of randi(10," + n + ",1)")
randn 函数生成从标准正态分布中抽取的随机实数浮点数。例如,创建一个含有标准正态分布数的 20,000×1 的列向量。
n = 20000; r3 = randn(n,1);
histogram(r3) xlabel("Value") ylabel("Counts") title("Histogram of randn(" + n + ",1)")
randperm 函数生成无重复值的 double 类型的随机整数数组。例如,创建一个 1×10 数组,其中包含从区间 [1,15] 中随机选择的整数。
r4 = randperm(15,10);
randi(可能返回包含重复值的数组)不同,randperm 返回无重复值的数组。绘制这些值的直方图。每个整数在直方图中最多出现一次。histogram(r4) xticks(1:15) xlim([0 16]) yticks([0 1]) xlabel("Value") ylabel("Counts") title("Histogram of randperm(15,10)")
接连调用上述任一函数均可返回不同的结果。这种特性适合用于创建不同的随机值数组。
指定随机数种子和生成器
您可以使用 rng 函数设置 rand、randi、randn 和 randperm 函数使用的种子和生成器算法。种子设置随机数生成器的初始状态,并使您能够重现随机数序列。生成器算法确定用于生成随机数序列的算法。
MATLAB 提供下表中的生成器算法。
| 名称 | 描述 |
|---|---|
"twister"(默认值) | 梅森旋转 |
"combRecursive" | 组合多递归生成器 |
"multFibonacci" | 乘法滞后斐波那契生成器 |
| 64 位置换同余生成器,采用双重异或移位乘法 |
"philox" | 执行 10 轮的 Philox 4×32 生成器 |
"simdTwister" | 面向 SIMD 的快速梅森旋转算法 |
"threefry" | 执行 20 轮的 Threefry 4×64 生成器 |
| 采用 256 位状态和双精度加法运算的异或移位旋转 (xor-shift-rotate) 生成器 |
使用 rng 函数可设置 rand、randi、randn 和 randperm 函数使用的种子和生成器。
例如,rng(0,"twister") 将种子设置为 0,将生成器算法设置为梅森旋转。要避免在 MATLAB 重新启动时重复随机数数组,请参阅随机数为什么可在启动后重复出现?。
有关控制随机数生成器的状态以便您使用相同的随机数重复计算或保证在重复计算中使用不同随机数的详细信息,请参阅Control Random Number Generation。
您可以从 MATLAB 设置窗口中更改随机数生成器的默认种子和算法 (自 R2023b 起)。如果您不更改这些设置,rng 将使用种子为 0 的梅森旋转生成器的出厂值 "twister"。有关详细信息,请参阅 随机数生成器的默认设置 和 随机数生成器的可再现性。
指定随机数数据类型
rand 和 randn 函数默认情况下会生成双精度类型的值。
rng("default")
A = rand(1,5)A = 1×5
0.8147 0.9058 0.1270 0.9134 0.6324您也可以显式指定随机数的数据类型。例如,将数据类型指定为 double。
rng("default") B = rand(1,5,"double")
B = 1×5
0.8147 0.9058 0.1270 0.9134 0.6324tf = isequal(A,B)
ans = logical 1
rand 和 randn 也可以生成单精度类型的值。
rng("default") A_single = rand(1,5,"single")
A_single = 1×5 single row vector
0.8147 0.9058 0.1270 0.9134 0.6324这些值与将上一示例中的双精度值转换为单精度后的值相同。无论输出数据类型如何,rand 函数抽取的随机数流都会以相同方式增加。
B_single = cast(B,"single");
isequal(A_single,B_single)ans = logical 1
randi 函数支持单精度和双精度类型,以及除 int64 和 uint64 之外的所有整数类型。
A = randi([1 10],1,5,"double")A = 1×5
1 3 6 10 10B_uint8 = randi([1 10],1,5,"uint8")B_uint8 = 1×5 uint8 row vector
2 10 10 5 9另请参阅
rng | rand | randi | randn | randperm