Asked by Kelly McGuire
on 14 Jan 2019

How would add a bias or probability of 34%, 22%, 22%, and 22% for each of the four directions in the attached random walk code?

Answer by TADA
on 14 Jan 2019

Edited by TADA
on 14 Jan 2019

Accepted Answer

you can make a step & bias vector:

stepCoordinates = [1,0;0,1;-1,0;0,-1];

% this creates the bias to the north

bias = [ones(1, 34), repmat([2 3 4], 1, (100-34)/3)];

then when you generate the actual steps in your loop use this instead of what you had:

stepBiasIndex = randi(100, 1, numberOfSteps);

stepCoordIndex = bias(stepBiasIndex);

delta = stepCoordinates(stepCoordIndex,:);

if continuousSteps

signOfStep = sign(delta);

plusminusRandSign = [-1 1];

indicesWithSignZero = signOfStep == 0;

signOfStep(indicesWithSignZero) = plusminusRandSign(randi(2, size(signOfStep(indicesWithSignZero))));

delta = delta - signOfStep.*rand(numberOfSteps, 2);

end

deltax = delta(:,2)';

deltay = delta(:,1)';

You can vectorize the rest of it but you said it does what you want so i didn't touch anything else

In this specific solution the bias is only in percentage because the bias vector is a 1x100 vector

so if you want to be more specific about it you can make it a 1x1000 for promils or 1x10000 for higher precision...

I attached the edited file

TADA
on 14 Jan 2019

That's Right Ecause That The Bias Of North Is 34 It Eaves 66/3 For HE Other Three....

You Can Easily Change The Content Of That Vector To Add Bias In Any Direction, For Instance

bias = [ones(1,34),repmat(2,1,40),repmat(3,1,13),repmat(4,1,13)];

Now That Would Be 34% North, 40% East And 13% West And South.

Kelly McGuire
on 14 Jan 2019

Excellent! That is great, thank you.

TADA
on 14 Jan 2019

Cheers! Good Luck

Sign in to comment.

Answer by Walter Roberson
on 14 Jan 2019

There was a recent question in which someone asked for going immediately back to be prohibitted and for the probability of going forward to be doubled. My suggestion then was:

dd = randi(4)

for ss = 1:500

rr = rand;

if rr < 1/4

dd = 1+mod(dd,4) %next higher direction

elseif rr < 1/2

dd = 1+mod(dd-2,4) %next lower direction

end % 50 percent stays same direction

if dd==1

yy=yy+1; %north

elseif dd==2

xx=xx+1; %east

elseif dd==3

yy=yy-1; %south

else

xx=xx-1; %west

end

plot here probably

end

The initial dd is about picking some initial direction. The directions are numbered 1 (north), 2 (east), 3 (south), 4 (west), and the new direction is computed as a change of 0, -1 or +1 to the current direction (-2 was ruled out by not being permitted to go backwards.) You can modify the rr tests for whatever probabilities you want.

It is not clear to me in your question whether the 34% should be for a particular fixed direction (e.g., prefer to head east), or for a relative direction (e.g., prefer to go straight) ?

Kelly McGuire
on 14 Jan 2019

Walter Roberson
on 14 Jan 2019

randsample() the direction numbers with a weights matrix.

Or construct

dv = [1*ones(1,34), 2*ones(1,22), 3*ones(1,22), 4*ones(1,22)]; %direction 1 is overrepresented

dx = [-1 0 1 0]; dy = [0 1 0 -1];

rand_direction = randi(length(dv), 1, num_steps_needed);

rand_dx = dx(rand_direction);

rand_dy = dy(rand_direction);

x_positions = [initial_x, cumsum(rand_dx)];

y_positions = [initial_y, cumsum(rand_dy)];

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## TADA (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/439633-adding-bias-to-random-walk#comment_660090

## Kelly McGuire (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/439633-adding-bias-to-random-walk#comment_660113

## TADA (view profile)

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/439633-adding-bias-to-random-walk#comment_660164

Sign in to comment.