我想在每次模拟开始时从一组数字中选择一个数字,即 [1011, 1001, 1111, 1101, 0011] 一次。但我没有从随机数生成器块中得到任何帮助。 MATLAB 代码适用于这种情况,因此我使用 matlab 函数块在仿真中运行代码。但代码会持续运行并产生价值。有什么办法解决这个问题吗?
我在功能块中使用的代码是:
数字 = [1011, 1001, 1111, 1101, 0011, 0101, 1100]; % 生成随机索引 索引 = randi(长度(数字)); % 显示随机数 数据=(数字(索引));
尝试了很多事情。但它要么生成频繁的随机值,要么在每次模拟中从一组数字中显示相同的值。
Simulink 中有几个随机数生成器块,但它们使用种子,以便模拟在运行过程中保持一致。如果您每次运行模拟时都想要不同的值,那么我认为您需要使用 MATLAB 函数块,因为这样您每次都可以使用
rng('shuffle')
从随机种子开始。
function y = fcn()
% MATLAB function block code for Simulink model with random seed
rng('shuffle');
y = rand();
正如你所说,这将在每个时间步生成一个新的随机数。
您可以通过两种方式更改行为,以便在模拟开始时仅生成一次随机数,要么:
在上述函数中使用持久变量,因此仅设置一次。
Simulink 模型不变,但 MATLAB 函数代码变为:
function y = fcn()
% MATLAB function block code for Simulink model with random seed
% Use a persistent variable to only regen the random number at start
persistent r
if isempty( r )
rng('shuffle');
r = rand();
end
y = r;
或者使用仅在第一个时间步运行的启用子系统。这是一个不错的选择,因为在模拟中添加其他条件来触发随机输出的更新更容易。
您将使用原始 MATLAB 函数代码(没有持久变量),但将该模块放入启用子系统中。启用端口的输入是常量 0,因此永远不会启用,而是通过初始值为 1 的 Memory 模块。这意味着在第一个时间步,使用 Memory 的初始值 1 并且子系统运行,但对于所有未来的时间步子系统将被禁用。已启用子系统的默认输出行为是保留先前的输出,因此初始随机数将持续存在。如前所述,如果您想触发更新,可以使启用的逻辑变得更复杂。