MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply TodayTo resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Asked by Clifford Shelton on 3 Aug 2012

It's not easy being a beginner!

Ok..I'm trying to add some bias to the following random walk in values. Here's the example code:

for i=1:20; % Let j = probability for specific value % Let k = the probability that two adjacent values will be equal

j =rand; k =rand;

if 0<=k<=.0063 value(i+1)=value(i);

elseif 0<=j<=.0687 value(i+1)=0;

elseif .0688<=j<=.1880 valuei+1)=1;

elseif .1881<=j<=.3286 value(i+1)=2;

How would I add a constraint (or bias) the above random walk so that every 10 adjacent values (of the 20 random values that will be generated by the above code) **must** maintain a moving average with the value of 1?

I hope i'm clear on what I'm trying to do. Thanks for all the help in advance!

*No products are associated with this question.*

Answer by Sven on 3 Aug 2012

Edited by Sven on 3 Aug 2012

Hi Clifford, Your description (from the comments above) will only happen if the second 10 numbers are an exact copy of the first 10 numbers. Think of it this way:

Imagine your first 10 random numbers add up to 10. Numbers 2:11 have simply dropped the first number and added the 11th number. If the sum of these must **also** add up to 10, this will only happen if i(11)==i(1), and then i(12)==i(2) for the next set, etc.

That being said, here's how I would do it:

% Make the first 10 random numbers randSet = rand(10,1);

% Force them (by scaling) to add up to 10 randSet = randSet * (10/sum(randSet));

% Turn them into 20 numbers (by copying, as per my description above) finalRandSet = [randSet; randSet];

% See that all windows of 10 adjacent numbers equal 10 sum(finalRandSet(1:10)) sum(finalRandSet(5:14)) sum(finalRandSet(9:18))

Did this help you out Clifford?

Show 3 older comments

Sven on 3 Aug 2012

So your list above is **not** "a set of 20 numbers"... instead it is "two sets of 10 numbers" and the first set of 10 is completely independent of the second set of 10. Your example would be better described as this:

"I have an N-by-10 matrix of random numbers. I want the average of each row of 10 numbers to equal 4".

% Make N sets of 10 random numbers N = 5; randSet = rand(N,10); % Force rows (by scaling) to add up to 40 (or average to 4) randSet = bsxfun(@times, randSet, 40./sum(randSet,2));

If you want them all to be random *integers* it will be a tiny bit more tricky, but the same principle should apply.

Clifford Shelton on 3 Aug 2012

Ok...that is a better way to look at what I'm trying to do. Thanks. But now i'm a little confused as to how can I after forcing the rows to add up to 40 (by scaling) then set a probabilities (or bias) for specific values that could be created "randomly".

so in other words:

for example, I want to populate a 5-by-10 matrix.

I want the average of each row of 10 numbers to equal 4.

AND I want a 10% probability that the first value is 1

a 5% probability that the first vale is 2

a 15% probability that the first value is 3

a 10% probability that the first value is 4 etc...etc...

This way I want to generate a program that can solve the problm of generating values for my matrix with strict bias of 1. having each group of 10 averaging to 4 and 2. populating the list with biased probabilities.

Thanks for all your help!!

## 3 Comments

Direct link to this comment:http://www.mathworks.nl/matlabcentral/answers/45175#comment_92850

I am sorry but i cant understand what you asking? what is your aim there? are you trying to get a random number between A and B.

or you just want that for each 10 random number created the sum of them must be 1.?

Direct link to this comment:http://www.mathworks.nl/matlabcentral/answers/45175#comment_92852

Ok. The for loop will create 20 random numbers. I want every 10 adjacent numbers together to have an average equal to 1. Example: I want {(i(1)+i(2)+i(3)+i(4)....)/10=1}

So i'm trying to create a constraint (or bias) within the random number generation.

I hope that is clearer. Sorry for the confusion

Direct link to this comment:http://www.mathworks.nl/matlabcentral/answers/45175#comment_92941

I posted some code on your duplicate question where you already received lots of feedback: http://www.mathworks.co.uk/matlabcentral/answers/45204-adding-a-constraint-to-my-if-else-if-statement

The moving average condition comes out now.

Please, formulate the condition concisely and clearly in your old post before duplicating it.