5.0 | 10 ratings Rate this file 86 Downloads (last 30 days) File Size: 8.22 KB File ID: #9700 Version: 1.0
image thumbnail

Random Vectors with Fixed Sum


Roger Stafford (view profile)


19 Jan 2006 (Updated )

Randomly and uniformly generates vectors with a specified sum and values in a specified interval.

Editor's Notes:

This file was a File Exchange Pick of the Week

| Watch this File

File Information

This generates m random n-element column vectors of values, [x1;x2;...;xn], each with a fixed sum, s, and subject to a restriction a<=xi<=b. The vectors are randomly and uniformly distributed in the n-1 dimensional space of solutions. This is accomplished by decomposing that space into a number of different types of simplexes (the many-dimensional generalizations of line segments, triangles, and tetrahedra.) The 'rand' function is used to distribute vectors within each simplex uniformly, and further calls on 'rand' serve to select different types of simplexes with probabilities proportional to their respective n-1 dimensional volumes. This algorithm does not perform any rejection of solutions - all are generated so as to already fit within the prescribed hypercube.

MATLAB release MATLAB 5.2 (R10)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (16)
17 Apr 2015 J.E. Wong

may i ask what if i want to produce random numbers with fixed sum following a Gaussian distribution but without limit on the intervals?
i have tried to put a=-inf and b=inf but it ends up with NaN. (may be becoz s = (s-n*a)/(b-a) produces inf/inf?). is the rand generated from this algorithm following Gaussian too? many thx!

24 Dec 2014 John D'Errico

John D'Errico (view profile)

I think Mohammad does not understand what this code does. In fact, it does work properly, and it does that job quite well and efficiently.

Besides, one should never just say simply that something does not work. Instead, show what you tried, and explain why you think it did not work. Then others can see either what you misunderstand about the code, or they can see why there may be a problem in the code. In this case, I happen to know the code does work as designed.

Comment only
23 Dec 2014 mohammad

This Function does not work properly. I tried this file several times and I got histogram for the values. The probabilities of the random values are not the same. It may cause serious problem when you are trying to run an optimization problem. However, It is a good job!

Comment only
05 Apr 2014 vachelard

I try to use the function, but I have a problem when I'm driving.
I have a matrix A (193.1) I would like to create a matrix (193.3) whose sum equals one line to my matrix A.
I tried the following code but I meet an error:

Rhedgefund = Y (:, 1);

cols_to_generate = 3;

for K = 1: length (Y)

    Neva (K, :) = randfixedsum (1 cols_to_generate, Y (K), -0.15, 0.15);

He told me:

Index EXCEEDS matrix dimensions.

Error in randfixedsum (line 95)

x = (b-a) * x (p + repmat ([0: n: n * (m-1)] n, 1)) + a; % Switches & rescale x
95 x = (b-a) * x (p + repmat ([0: n: n * (m-1)] n, 1)) + a; % Switches & rescale x

I do not know how to solve problem

Comment only
10 Apr 2013 shatakshi sharma

i am trying to generate 6 random nmbrs within given range and sum:
xmin=[10 10 40 35 130 125];
xmax=[125 150 250 210 325 315];
Pg=randfixedsum(1,6,200,xmin, xmax);
it is giving following error:
?? Error using ==> minus
Matrix dimensions must agree.

Error in ==> randfixedsum at 56
s1 = s - (k:-1:k-n+1); % s1 & s2 will never be negative

Error in ==> busdatas at 47
Qg=randfixedsum(30,1,total(8),xmin, xmax);

can sm1 tell wats wrong..i cnt figure it out..

Comment only
08 Jun 2012 Olga Petrik  
24 Feb 2012 Matlab2010

excellent! well done

Comment only
24 Feb 2012 Matlab2010

excellent! well done

13 Oct 2011 Christophe Lauwerys

Nice. I'm trying to generate random data within a simplex defined by linear inequality constraints.

Lets say I already have the N vertices of the simplex defined by the inequalities. Is it then correct to first generate a random sample in the interval [0,1] with a sum equal to 1, and then take the inner product of this sample with the vector of vertices?

Something along the lines of:

X = rand(6,2);
k = convhull(X);
plot(X(k,1),X(k,2),'b'), hold on
nv = numel(k)-1; % Nmuber of vertices
X = X(k(1:end-1),:); % Remove repeated first vertex
L = randfixedsum(size(X,1),1000,1,0,1);
Y = L'*X;
plot(Y(:,1),Y(:,2),'r.'), hold off

Maybe I shouldn't trust my vision on this, but the samples don't really look uniformly spread within the simplex. For some reason they only seem to do for a triangle.

Any thoughts?



Comment only
27 Feb 2011 Bruno Luong

Bruno Luong (view profile)

12 Jan 2011 Mate 2u

Hi when i try to use the function on a very large a array it gives me the following error...

??? Maximum variable size allowed by the program is exceeded.

Error in ==> randfixedsum at 58
w = zeros(n,n+1); w(1,2) = realmax; % Scale for full 'double' range

10 Nov 2010 Vassilios Vassiliadis


02 Apr 2010 Florian

Exactly what I was looking for!!! Many thanks for the great work!!!

03 Apr 2007 Per-Anders Ekström


01 Sep 2006 Mike Edwards

very useful! beautiful code!

30 Jan 2006 John D'Errico

This took a bit of work to verify uniformity in a slice of an n-dimensional hypercube. I'm now confident that Roger has done what he claimed, having checked samplings in several different dimensions, as well as having thought through the process he used to generate the sampling.

Contact us