Skip to content

MATLAB - 随机数

生成随机数是模拟、统计、密码学和测试中的一项基本任务。MATLAB 提供了一套强大而灵活的函数,用于从各种分布中生成随机数。生成的数字是伪随机的,这意味着它们由确定性算法生成,但在统计上与真随机数无法区分。

本教程涵盖了核心函数 rand、randn、randi,以及控制随机数生成器以获得可重现结果的现代最佳实践。

在生成数字之前,理解如何控制随机数生成器至关重要。这确保了您的结果是可重现的,这对于调试、测试和分享研究至关重要。

对此,现代推荐的函数是 rng。

  • rng('default'):将生成器重置为其默认启动设置。在脚本开头使用此命令可确保它始终生成相同的随机数序列。
  • rng(seed):使用特定的整数 seed 为生成器设置种子。使用相同的种子将始终产生相同的结果。例如,rng(0)。
  • rng('shuffle'):根据当前时间为生成器设置种子。这使得每次运行代码都会产生不同的结果。
  • s = rng 和 rng(s):将生成器的当前状态保存到结构体 s 中,稍后可以恢复它。这对于在不重置整个序列的情况下重现特定代码块非常有用。
% 不控制种子,每次结果都不同
disp('Run 1:');
disp(rand(1, 3));
disp('Run 2 (different results):');
disp(rand(1, 3));
% --- 现在,使用 rng 实现可重现性 ---
rng('default'); % 设置一个已知起点
disp('Run 3 (reproducible):');
disp(rand(1, 3));
rng('default'); % 重置到相同的起点
disp('Run 4 (same as Run 3):');
disp(rand(1, 3));
% 预期输出:
% Run 1:
% 0.8147 0.9058 0.1270 (这些值在您的系统上会有所不同)
% Run 2 (different results):
% 0.9134 0.6324 0.0975 (这些值在您的系统上会有所不同)
% Run 3 (reproducible):
% 0.8147 0.9058 0.1270
% Run 4 (same as Run 3):
% 0.8147 0.9058 0.1270

rand 函数生成介于 0 和 1 之间的连续均匀分布随机数。

SyntaxDescription
X = rand返回一个随机标量。
X = rand(n)返回一个 nxn 的随机数矩阵。
X = rand(sz1, sz2, ..., szN)返回一个 sz1xsz2x…xszN 数组。
X = rand([sz1, sz2, ..., szN])与上述相同,使用大小向量。
X = rand(___, typename)返回 single 或 double 类型的数组。
rng(0); % 用于可重现结果
% 一个 3x3 的随机数矩阵
mat = rand(3, 3)
% 一个 2x4 的单精度随机数矩阵
mat_single = rand(2, 4, 'single')
% 在范围 [a, b] 内生成随机数
% 公式:r = a + (b-a).*rand(sz)
a = 10;
b = 20;
random_in_range = a + (b-a).*rand(1, 5)
% 预期输出:
% mat =
% 0.8147 0.1576 0.6557
% 0.9058 0.9706 0.0357
% 0.1270 0.9572 0.8491
%
% mat_single =
% 2x4 single matrix
%
% 0.9340 0.3784 0.8600 0.8537
% 0.6787 0.8132 0.0154 0.0427
%
% random_in_range =
% 16.9457 17.7513 14.6096 16.5574 10.3571

randn 函数生成来自标准正态分布(均值为 0,标准差为 1)的随机数。其语法与 rand 相同。

rng(1); % 用于可重现结果
% 一个来自标准正态分布的 2x3 矩阵
normal_mat = randn(2, 3)
% 从具有特定均值和标准差的正态分布中生成数字
% 公式:r = mean + std_dev.*randn(sz)
mu = 50; % 均值
sigma = 5; % 标准差
custom_normal = mu + sigma.*randn(1, 4)
% 预期输出:
% normal_mat =
% 0.4889 -1.0636 0.3394
% -1.0998 0.3149 1.3435
%
% custom_normal =
% 48.5137 52.2872 48.8358 46.1963

randi 函数生成均匀分布的伪随机整数。

SyntaxDescription
X = randi(imax)返回一个介于 1 和 imax 之间的单个整数。
X = randi(imax, n)返回一个 nxn 的整数矩阵。
X = randi([imin, imax], sz)返回一个大小为 sz 且整数范围在 [imin, imax] 内的数组。
rng(100); % 用于可重现结果
% 一个介于 1 和 10 之间的单个整数(就像掷一个 10 面骰子)
die_roll = randi(10)
% 一个介于 -5 和 5 之间的 3x3 整数矩阵
int_matrix = randi([-5, 5], 3, 3)
% 预期输出:
% die_roll =
% 9
%
% int_matrix =
% -4 1 -1
% 0 4 4
% -3 -3 5

randperm 函数创建整数的随机排列。

rng(2023); % 用于可重现结果
% 1 到 8 之间整数的随机排列
% 用于打乱数据很有用
p1 = randperm(8)
% 从 1 到 20 的范围中选择 4 个唯一的随机整数
% 用于不重复随机抽样很有用
k_unique = randperm(20, 4)
% 预期输出:
% p1 =
% 2 3 8 1 4 5 7 6
%
% k_unique =
% 14 10 7 12