更换不推荐的 rand 和 randn 语法
不建议使用的语法说明
在早期版本的 MATLAB® 中,是通过 'seed'
、'state'
或 'twister'
输入来控制 rand
和 randn
函数所用的随机数生成器的。例如:
rand('seed',sd) randn('seed',sd) rand('state',s) randn('state',s) rand('twister',5489)
这些语法引用不同类型的生成器,由于下列原因,不建议继续使用这些语法:
对于生成器来说,
'seed'
和'state'
的说法具有误导性。所有生成器(
'twister'
除外)都有缺陷。它们对
rand
和randn
使用不同的生成器,但这没有必要。
要评估替换您现有代码中不建议使用的语法所带来的影响,请在启动 MATLAB 会话时执行以下命令:
warning('on','MATLAB:RandStream:ActivatingLegacyGenerators') warning('on','MATLAB:RandStream:ReadingInactiveLegacyGeneratorState')
替换语法说明
使用 rng
函数可以控制 rand
、randn
、randi
以及所有其他随机数生成器(如 randperm
、sprand
等)使用的共享生成器。要了解在替换不建议使用的语法时如何使用 rng
函数,需要花些时间来了解这些语法的功能。这应该有助于了解哪种新的 rng
语法最适合需要。
rand(Generator,s)
或 randn(Generator,s)
的第一个输入指定了生成器的类型,具体如下所述。
|
除非试图准确地重新生成早期版本的 MATLAB 中生成的随机数,否则不建议再使用 v4
和 v5
生成器。更新代码的最简单方法是使用 rng
。rng
函数按如下所示替换 rand
和 randn
所用生成器的名称。
rand/randn 所用生成器的名称 | rng 所用生成器的名称 |
---|---|
'seed' | 'v4' |
'state' |
|
'twister' | 'twister' (推荐) |
使用整数种子初始化生成器的替换语法
在 rand(Generator,sd)
语法中,整数种子 sd
的最常见用途是:
每次重新生成完全相同的随机数(例如使用 0、1 或 3141879 等种子)
尽可能确保 MATLAB 每次运行时总能提供不同的随机数(例如,使用
sum(100*clock)
等种子)
下表显示了整数种子为 sd
的情况下的语法替换。
第一列显示了不建议使用的
rand
和randn
语法。第二列显示了如何使用新的
rng
函数准确地重现不建议使用的行为。在大多数情况下,这可以通过指定旧生成器类型(例如 v4 或 v5 生成器)来实现,但不建议再使用这种方式。第三列显示了推荐的替代方式,该方式不会为
rng
指定可选的生成器类型输入。因此,如果您总是忽略Generator
输入,rand
、randn
和randi
将使用默认生成器类型和种子值。在 MATLAB 启动时使用的默认生成器类型是种子值为 0 的梅森旋转生成器。您可以在 MATLAB 预设项中更改随机数生成器的默认算法和种子 (自 R2023b 起)。有关详细信息,请参阅rng
。
不建议使用的 rand/randn 语法 | 不推荐:通过指定生成器类型准确重现不推荐的行为 | 推荐的备用方式:不覆盖生成器类型 |
---|---|---|
rand('twister',5489) | rng(5489,'twister') | rng('default') |
rand('seed',sd) | rng(sd,'v4') | rng(sd) |
randn('seed',sd) | ||
rand('state',sd) | rng(sd,'v5uniform') | |
randn('state',sd) | rng(sd,'v5normal') | |
rand('seed',sum(100*clock)) | rng(sum(100*clock),'v4') | rng('shuffle') |
使用状态向量初始化生成器的替换语法
在 rand(Generator,st)
语法中,状态向量(此处显示为 st
)的最常见用途是准确地重新生成在算法或迭代的特定点处生成的随机数。例如,可以在调试时使用此向量作为辅助。
rng
函数可更改随机数生成器的状态保存和恢复模式,如下表所示。左列中的示例假定正在使用 v5
均匀生成器。右列中的示例使用新的语法,适用于任何生成器。
不建议的 rand/randn 使用语法 | 使用 rng 的新语法 |
---|---|
% Save v5 generator state. st = rand('state'); % Call rand. x = rand; % Restore v5 generator state. rand('state',st); % Call rand again and hope % for the same results. y = rand | % Get generator settings. s = rng; % Call rand. x = rand; % Restore previous generator % settings. rng(s); % Call rand again and % get the same results. y = rand |
有关演示,请观看此说明性视频。
如果无法从不建议使用的语法升级
如果存在无法修改或不允许修改的代码,并且知道该代码使用的是不推荐的随机数生成器控制语法,则务必记住,当使用该代码时,MATLAB 将会切换为旧模式。在旧模式下,rand
和 randn
由不同的生成器控制,设置各不相同。
在旧模式下调用 rand
使用以下生成函数之一:
'v4'
生成器(由rand('seed', ...)
控制)'v5uniform'
生成器(由rand('state', ...)
控制)'twister'
生成器(由rand('twister', ...)
控制)
在旧模式下调用 randn
使用以下生成函数之一:
'v4'
生成器(由randn('seed', ...)
控制)'v5normal'
生成器(由randn('state', ...)
控制)
如果依赖的代码将 MATLAB 置于旧模式,请使用以下命令退出旧模式并返回默认初始生成器:
rng('default')
此外,要保护将 MATLAB 置于旧模式的代码,请使用:
s = rng % Save current settings of the generator. ... % Call code using legacy random number generator syntaxes. rng(s) % Restore previous settings of the generator.