## Generate a uniform random vector

Hi all, I'm trying to generate uniform random vectors with n dimensions.
To be more precise, each of the elements of the vector must be a uniform distributed variable in [0,1]
The constraint is that the sum of the elements of the vector must be 1.
I tried different solutions for over a week but i can't get it working.
 PhysOrg.com science news on PhysOrg.com >> Galaxies fed by funnels of fuel>> The better to see you with: Scientists build record-setting metamaterial flat lens>> Google eyes emerging markets networks

 Quote by 3HeadedMonkey Hi all, I'm trying to generate uniform random vectors with n dimensions. To be more precise, each of the elements of the vector must be a uniform distributed variable. The constraint is that the sum of the elements of the vector must be 1. I tried different solutions for over a week but i can't get it working. Can you help me, please?
Hey 3HeadedMonkey and welcome to the forums.

There are many ways to do this, but one that I think is simple an intuitive is to generate N independent U(0,1) realizations and then normalize all elements by dividing by the total sum of all elements.

In terms of generation, the actual mechanisms can be complicated but you can use anything from R to QBASIC to generate a random number from U(0,1). You can also use a random number table which is just a printed table of random numbers.

Also another good source of random numbers is http://www.random.org

 Quote by chiro Hey 3HeadedMonkey and welcome to the forums. There are many ways to do this, but one that I think is simple an intuitive is to generate N independent U(0,1) realizations and then normalize all elements by dividing by the total sum of all elements. In terms of generation, the actual mechanisms can be complicated but you can use anything from R to QBASIC to generate a random number from U(0,1). You can also use a random number table which is just a printed table of random numbers. Also another good source of random numbers is In R (which you can download for free) the command for generating a realization from a uniform distribution is runif() and you can type help(runif) in R to give the command line arguments.
Hi chiro, thanks for the reply. If you generate N variables and then you divide by the total sum you no longer have N uniform random variables. If you try, you can see that the plot of the frequencies of a single variable is no longer "flat". I could try to use R, but only a question: can I easily use it by command line? I need this vector to be generated automatically many times by a C++ program

## Generate a uniform random vector

 Quote by 3HeadedMonkey Hi chiro, thanks for the reply. If you generate N variables and then you divide by the total sum you no longer have N uniform random variables. If you try, you can see that the plot of the frequencies of a single variable is no longer "flat". I could try to use R, but only a question: can I easily use it by command line? I need this vector to be generated automatically many times by a C++ program
What you are saying is true, but the thing is you will never truly have N independent U(0,1) variables with your constraint. Because you have introduce a dependency between observations, there will always be a dependency not only between the variables, but also between the definitions of the variables as well.

You can use R like a console: you type in one command and it will spit out the output. You type one command at a time and you can store results in variables. You don't need to declare variables like you do in C or C++ and it's a lot easier than using C or C++.
 Recognitions: Science Advisor We can't guess what you really want to do here, but think about the case where N = 1 and it should be obvious that what you desribed in your OP is impossible. If there is a constraint involving N variables, you can only make N-1 indepedent choices. You probably need to think what that means in terms of the problem you want to solve, before you get into the details of writing code.

 Quote by AlephZero We can't guess what you really want to do here, but think about the case where N = 1 and it should be obvious that what you desribed in your OP is impossible. If there is a constraint involving N variables, you can only make N-1 indepedent choices. You probably need to think what that means in terms of the problem you want to solve, before you get into the details of writing code.
Take the case with N=2
Generate v[0] as uniform[0,1]
Calculate v[1] as 1-v[0]
Result: 2 uniform variables (not independent but uniform)
If you plot the frequencies of the two variables, the plots are "flat". I mean each of the two variables is uniformly distributed. Obviously v[1] is uniform by definition. Then v[1] is uniform too but "mirrored" with respect to 0.5.
I think that this could be valid with more than 2 variables.

I thought that someone could know some well known mathemagical formula to generate this kind of vectors ;-)

Recognitions:
 Quote by 3HeadedMonkey I think that this could be valid with more than 2 variables.
It doesn't work for N > 2, because the sum of N-1 uniformly distributed variables is not uniformly distributed. In fact, using the central limit theorem, the sum will approximate to a normal distribution for large N.

 It doesn't work for N > 2, because the sum of N-1 uniformly distributed variables is not uniformly distributed. In fact, using the central limit theorem, the sum will approximate to a normal distribution for large N.
ok this is what i feared. Thank you anyway
 Recognitions: Science Advisor In order to get a unit N dimensional unit vector, uniform on the surface of an N sphere, you need to be careful. The suggestion that you take N independent uniformly distributed between -1 and 1 is incorrect since the distribution will not be the same as uniform on the N sphere. To illustrate let N = 2, then you would be picking points uniform on a square so that directions along the diagonals would be preferred. To avoid this use a rejection technique, and keep vectors only if the original length is < 1. The main problem with this approach is that it is inefficient for higher dimensions. Alternatively one could convert to the N dimensional analog of spherical coordinates and choose angles uniform in the appropriate domain.

 Quote by mathman Alternatively one could convert to the N dimensional analog of spherical coordinates and choose angles uniform in the appropriate domain.
That seems like the easy way to do it.
 Recognitions: Science Advisor I don't know if this is relevant to the goal of the original post, but in post #4 of the thread, http://physicsforums.com/showthread.php?t=587264, the member Petawa gives a link to a paper that deals with selecting a random subspace in N dimensions. "Some Remarks On A Lemma Of Ran Raz" by Milman and Wagner.

 That seems like the easy way to do it.
Yes, easy but wrong. In fact if you look at the plot of sin and cos you see that there are more points in the codomain when sin and cos come near to 1.
My original idea was to find a distribution (not uniform) to generate these angles such that the result of sin and cos would be uniform. I don't know if it is possible or not

 Quote by Stephen Tashi I don't know if this is relevant to the goal of the original post, but in post #4 of the thread, [], the member Petawa gives a link to a paper that deals with selecting a random subspace in N dimensions. "Some Remarks On A Lemma Of Ran Raz" by Milman and Wagner.
Thank you, i could try to look at this later, now i returned to use the normalization (much easier than the angles generation and equally bad )
 Recognitions: Science Advisor If the sum of the elements must be 1, the subspace isn't a sphere. If N = 2 it is a straight line joining (1,0) and (0,1), which gives a simple interpretation of why post #6 "works" for that special case. If N = 3 it is the surface of an equilateral triangle with vertices (1,0,0), (0,1,0) and (0,0,1). Maybe you really want a uniform distribution of points on the area of the triangle? If so, it's fairly clear that the x y and z coordinate are not an easy way to measure that. It would probably be better to choose the random variables using two parameters that describe the surface, then transform the point back to (x,y,z). For N = 4 the points fill the volume of an "equilateral" tetrahedron embedded in 4-D space, and similarly for higher values of N.

 Quote by AlephZero Maybe you really want a uniform distribution of points on the area of the triangle?
I have to think about this. If I want this, I can do it by repeatedly folding the hyperspace. I already coded it and it works. In this case the single elements are not uniform. But maybe the right thing to do.
I explain better the problem:
This vector is the input of an heuristic optimization algorithm, the random restarts are useful to find the global maximum. I want to restart in very random points (uniformly). So, I think that sampling the hyper-tetrahedron uniformly could be the best solution. Do you agree?

Recognitions: