如何在simulink中从一组数字中选取一个随机数?

问题描述 投票:0回答:1

我想在每次模拟开始时从一组数字中选择一个数字,即 [1011, 1001, 1111, 1101, 0011] 一次。但我没有从随机数生成器块中得到任何帮助。 MATLAB 代码适用于这种情况,因此我使用 matlab 函数块在仿真中运行代码。但代码会持续运行并产生价值。有什么办法解决这个问题吗?

我在功能块中使用的代码是:

数字 = [1011, 1001, 1111, 1101, 0011, 0101, 1100]; % 生成随机索引 索引 = randi(长度(数字)); % 显示随机数 数据=(数字(索引));

尝试了很多事情。但它要么生成频繁的随机值,要么在每次模拟中从一组数字中显示相同的值。

matlab random numbers simulink
1个回答
0
投票

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 并且子系统运行,但对于所有未来的时间步子系统将被禁用。已启用子系统的默认输出行为是保留先前的输出,因此初始随机数将持续存在。如前所述,如果您想触发更新,可以使启用的逻辑变得更复杂。

© www.soinside.com 2019 - 2024. All rights reserved.