Random vector on a sphere: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Carl McBride (talk | contribs) (Added description of Marsaglia algorithm) |
||
Line 1: | Line 1: | ||
Fortran 90 implementation from Ref. 2. ran() | The ability to generate a randomly orientated vector is very useful in [[Monte Carlo]] simulations of anisotropic [[models]] | ||
or molecular systems. | |||
==Marsaglia algorithm== | |||
This is the algorithm proposed by George Marsaglia (Ref. 1): | |||
*Independently generate V<sub>1</sub> and V<sub>2</sub>, taken from a unifor distribution on (-1,1) such that | |||
:<math>S=(V_1^2+V_2^2) < 1</math> | |||
*The random vector is then (Ref. 1 Eq. 4): | |||
:<math>\left(2V_1 \sqrt{1-S},~ 2V_2 \sqrt{1-S},~ 1-2S\right)</math> | |||
==Fortran 90 implementation== | |||
This Fortran 90 implementation is adapted from Ref. 2. The function '''ran()''' calls a [[Random_numbers | randon number generator]]: | |||
<small><pre> | <small><pre> | ||
! The following is taken from Allen & Tildesley, p. 349 | ! The following is taken from Allen & Tildesley, p. 349 | ||
Line 32: | Line 41: | ||
==References== | ==References== | ||
#[http://links.jstor.org/sici?sici=0003-4851%28197204%2943%3A2%3C645%3ACAPFTS%3E2.0.CO%3B2-%23 George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics '''43''' pp. 645-646 (1972)] | #[http://links.jstor.org/sici?sici=0003-4851%28197204%2943%3A2%3C645%3ACAPFTS%3E2.0.CO%3B2-%23 George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics '''43''' pp. 645-646 (1972)] | ||
#Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996) | #Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996) | ||
# M.P. Allen | # M. P. Allen and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989) | ||
[[category: random numbers]] | [[category: random numbers]] | ||
[[category: computer simulation techniques]] | [[category: computer simulation techniques]] |
Revision as of 13:43, 30 October 2007
The ability to generate a randomly orientated vector is very useful in Monte Carlo simulations of anisotropic models or molecular systems.
Marsaglia algorithm
This is the algorithm proposed by George Marsaglia (Ref. 1):
- Independently generate V1 and V2, taken from a unifor distribution on (-1,1) such that
- The random vector is then (Ref. 1 Eq. 4):
Fortran 90 implementation
This Fortran 90 implementation is adapted from Ref. 2. The function ran() calls a randon number generator:
! The following is taken from Allen & Tildesley, p. 349 ! Generate a random vector towards a point in the unit sphere ! Daniel Duque 2004 subroutine random_vector(vctr) implicit none real, dimension(3) :: vctr real:: ran1,ran2,ransq,ranh real:: ran do ran1=1.0-2.0*ran() ran2=1.0-2.0*ran() ransq=ran1**2+ran2**2 if(ransq.le.1.0) exit enddo ranh=2.0*sqrt(1.0-ransq) vctr(1)=ran1*ranh vctr(2)=ran2*ranh vctr(3)=(1.0-2.0*ransq) end subroutine random_vector
References
- George Marsaglia "Choosing a Point from the Surface of a Sphere", The Annals of Mathematical Statistics 43 pp. 645-646 (1972)
- Daan Frenkel and Berend Smit "Understanding Molecular Simulation: From Algorithms to Applications" p. 410 Academic Press (1996)
- M. P. Allen and D. J. Tildesley "Computer Simulation of Liquids", p. 349 Clarendon Press (1989)