使用MATLAB功能块在Simulink中生成随机数

Zan*_*ius 1 random matlab simulink matlab-coder

我试图谷歌这个问题并在这里搜索问题和答案,但我发现我的问题没有明确的答案,所以我正在制作一个新问题.希望不会太麻烦!

我正在Simulink中创建一个模拟,我有一个"MATLAB函数"-block,它应该从另一个源获取输入(我们可以认为这个源是一个"常量"-block),然后应用一个由输入上的MATLAB功能块.

我的问题是,每次运行Simulink仿真时,我都得到完全相同的随机数.我想知道是否有人可以帮助我解决我的问题?

这是代码(不是所有代码,但重要的是所有代码):

% function MC_output = randomizer(Stat_input)
%#codegen    minrand = 0.1;
    maxrand = 1.9;
    points = 10;    
    rand_numbers = Stat_input*minrand + rand(1, points).*(maxrand-minrand);
    MC_output = mean(rand_numbers);
end
Run Code Online (Sandbox Code Playgroud)

我已经读过这个解决方案:

coder.extrinsic('rng');
rng('shuffle');
Run Code Online (Sandbox Code Playgroud)

我以不同的方式使用它但没有成功.一些帮助会非常受欢迎!哦,顺便说一下,我正在使用MATLAB R2012a.

提前谢谢,尼克拉斯

Phi*_*ard 5

从MATLAB Fcn块调用的rand与从MATLAB调用的rand不同,因此其原因rng('shuffle');对Simulink的随机数生成没有影响.

你可以强制MATLAB Fcn Block使用MATLAB的rand函数,相当于,

function y = fcn
%#codegen
coder.extrinsic('rand','rng');
y = 0;

persistent atTime0
if isempty(atTime0)
    rng('shuffle');
    atTime0 = false;
end

y = rand;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用旧样式方法重置随机数的种子

function y = fcn(seed)
%#codegen

persistent atTime0
if isempty(atTime0)
    rand('seed',seed);
    atTime0 = false;
end

y = rand;
Run Code Online (Sandbox Code Playgroud)

但更简单的方法是将随机数/向量作为由均匀随机数生成器块生成的输入,其种子参数随机设置(使用MATLAB的rand函数).