Генерация случайных чисел в Simulink с функциональным блоком MATLAB

Я пытался как погуглить этот вопрос, так и найти среди вопросов и ответов здесь, но я не нашел определенного ответа на свой вопрос, поэтому я создаю новый. Надеюсь, особых проблем не будет!

Я создаю симуляцию в Simulink, где у меня есть блок «функция MATLAB», который должен получать входные данные из другого источника (мы можем рассматривать этот источник как «постоянный» блок), а затем применяю случайное число, которое генерируется из функциональный блок 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

Я читал об этом решении:

coder.extrinsic('rng');
rng('shuffle');

Я использовал его по-разному, но безуспешно. Некоторая помощь была бы очень признательна! О, и кстати, я использую MATLAB R2012a.

Заранее спасибо, Никлас


person Zantonius    schedule 25.06.2014    source источник


Ответы (1)


Ранд, вызываемый из вашего блока MATLAB Fcn, не является тем же самым рандом, который был бы вызван из MATLAB, поэтому причина, по которой rng('shuffle'); не влияет на генерацию случайных чисел Simulink.

Вы можете заставить блок MATLAB Fcn использовать функцию rand MATLAB, выполнив эквивалентную операцию:

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

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

y = rand;

Или вы можете использовать метод старого стиля для сброса начального числа случайного числа.

function y = fcn(seed)
%#codegen

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

y = rand;

Но более простой подход состоит в том, чтобы передать случайное число/вектор в качестве входных данных, сгенерированных унифицированным генератором случайных чисел блок с его параметром seed, установленным случайным образом (с использованием функции rand MATLAB).

person Phil Goddard    schedule 25.06.2014
comment
Большое спасибо! Это именно то, что я искал, и это работает отлично! :) - person Zantonius; 26.06.2014