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

xnifntxz  于 6个月前  发布在  Matlab
关注(0)|答案(1)|浏览(141)

我想在每次模拟开始时从一组数字中选择一个数字,即[1011,1001,1111,1101,0011]一次。但是我没有从随机数生成器块中得到任何帮助。MATLAB代码在这种情况下工作,所以我用matlab函数块在模拟中运行代码。但是代码一直在运行并生成值。有什么解决办法吗?
我在函数块中使用的代码是:
numbers = [1011,1001,1111,1101,0011,0101,1100]; %生成随机索引index = randi(length(numbers)); %显示随机数数据=(numbers(index));
尝试了很多东西。但它要么是生成频繁的随机值,要么是在一组数字的每次模拟中显示相同的值。

mefy6pfw

mefy6pfw1#

下面是为模拟器的第一个时间步生成变化的随机数的两个选项。您可能想更改MATLAB函数以输出索引数组值,或者只是使用randi而不是rand并输出随机索引本身。我将把适应留给您...
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的内存块。这意味着在第一时间步使用内存的初始值1,并且子系统运行,但是对于所有未来的时间步,子系统都被禁用。启用子系统的默认输出行为是保留以前的输出,因此初始随机数将持续存在。如前所述,如果您想要触发更新,可以使启用的逻辑更复杂。



相关问题