MATLAB - 随机数
MATLAB - 生成随机数
Section titled “MATLAB - 生成随机数”生成随机数是模拟、统计、密码学和测试中的一项基本任务。MATLAB 提供了一套强大而灵活的函数,用于从各种分布中生成随机数。生成的数字是伪随机的,这意味着它们由确定性算法生成,但在统计上与真随机数无法区分。
本教程涵盖了核心函数 rand、randn、randi,以及控制随机数生成器以获得可重现结果的现代最佳实践。
控制随机数生成器:rng
Section titled “控制随机数生成器:rng”在生成数字之前,理解如何控制随机数生成器至关重要。这确保了您的结果是可重现的,这对于调试、测试和分享研究至关重要。
对此,现代推荐的函数是 rng。
rng('default'):将生成器重置为其默认启动设置。在脚本开头使用此命令可确保它始终生成相同的随机数序列。rng(seed):使用特定的整数seed为生成器设置种子。使用相同的种子将始终产生相同的结果。例如,rng(0)。rng('shuffle'):根据当前时间为生成器设置种子。这使得每次运行代码都会产生不同的结果。s = rng和rng(s):将生成器的当前状态保存到结构体s中,稍后可以恢复它。这对于在不重置整个序列的情况下重现特定代码块非常有用。
示例:可重现性的重要性
Section titled “示例:可重现性的重要性”% 不控制种子,每次结果都不同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
Section titled “均匀分布数:rand”rand 函数生成介于 0 和 1 之间的连续均匀分布随机数。
| Syntax | Description |
|---|---|
X = rand | 返回一个随机标量。 |
X = rand(n) | 返回一个 nxn 的随机数矩阵。 |
X = rand(sz1, sz2, ..., szN) | 返回一个 sz1xsz2x…xszN 数组。 |
X = rand([sz1, sz2, ..., szN]) | 与上述相同,使用大小向量。 |
X = rand(___, typename) | 返回 single 或 double 类型的数组。 |
示例:使用 rand
Section titled “示例:使用 rand”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
Section titled “正态分布数:randn”randn 函数生成来自标准正态分布(均值为 0,标准差为 1)的随机数。其语法与 rand 相同。
示例:使用 randn
Section titled “示例:使用 randn”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
Section titled “随机整数:randi”randi 函数生成均匀分布的伪随机整数。
| Syntax | Description |
|---|---|
X = randi(imax) | 返回一个介于 1 和 imax 之间的单个整数。 |
X = randi(imax, n) | 返回一个 nxn 的整数矩阵。 |
X = randi([imin, imax], sz) | 返回一个大小为 sz 且整数范围在 [imin, imax] 内的数组。 |
示例:使用 randi
Section titled “示例:使用 randi”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
Section titled “随机排列:randperm”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