Search code examples
matlabrandomsimulinkmatlab-coder

Generating random numbers in Simulink with MATLAB function-block


I've tried to both google this question and search among the questions and answers here, but I've found no definitve answer to my question so I'm making a new one. Hopefully it won't be too much trouble!

I'm creating a simulation in Simulink where I have a "MATLAB function"-block that is supposed to take input from another source (we can consider this source a "Constant"-block) and then apply a random number that is generated from the MATLAB function-block on the input.

My problem is that I get the exact same randomized numbers every single time I run the Simulink simulation. And I was wondering if someone could help me solve my problem?

Here is the code (not all of it, but all of it that matters):

% 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

I've read about this solution:

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

I've used it in different ways but with no success. Some help would be greatly appriciated! Oh, and btw, I'm using MATLAB R2012a.

Thanks in advance, Niklas


Solution

  • The rand being called from your MATLAB Fcn Block is not the same rand as would be called from MATLAB, hence the reason why rng('shuffle'); has no effect on Simulink's random number generation.

    You could force the MATLAB Fcn Block to use MATLAB's rand function by doing the equivalent to,

    function y = fcn
    %#codegen
    coder.extrinsic('rand','rng');
    y = 0;
    
    persistent atTime0
    if isempty(atTime0)
        rng('shuffle');
        atTime0 = false;
    end
    
    y = rand;
    

    Or you can use the old style method for resetting the random number's seed

    function y = fcn(seed)
    %#codegen
    
    persistent atTime0
    if isempty(atTime0)
        rand('seed',seed);
        atTime0 = false;
    end
    
    y = rand;
    

    But the easier approach is to feed the random number/vector in as an input generated by the Uniform Random Number Generator block, with its seed parameter being set randomly (using MATLAB's rand function).