random_sphere
Generates pseudorandom points on a unit circle or K-dimensional sphere
Synopsis
#include <imsls.h>
float *imsls_f_random_sphere(int n_random, int k, 0)
The type double function is imsls_d_random_sphere.
Required Arguments
int n_random (Input)
Number of random numbers to generate.
int k (Input)
Dimension of the circle (k = 2) or of the sphere.
Return Value
n_random by k matrix containing the random Cartesian coordinates on the unit circle or sphere. To release this space, use imsls_free.
Synopsis with Optional Arguments
#include <imsls.h>
float *imsls_f_random_sphere (int n_random, int k,
IMSLS_RETURN_USER, float r[],
0)
Optional Arguments
IMSLS_RETURN_USER, float r[] (Output)
User-supplied array of size n_random by k containing the random Cartesian coordinates on the unit circle or sphere.
Description
Function imsls_f_random_sphere generates pseudorandom coordinates of points that lie on a unit circle or a unit sphere in K-dimensional space. For points on a circle (k = 2), pairs of uniform (-1, 1) points are generated and accepted only if they fall within the unit circle (the sum of their squares is less than 1), in which case they are scaled so as to lie on the circle.
For spheres in three or four dimensions, the algorithms of Marsaglia (1972) are used. For three dimensions, two independent uniform (-1, 1) deviates U1 and U2 are generated and accepted only if the sum of their squares S1 is less than 1. Then, the coordinates
are formed. For four dimensions, U1, U2, and S1 are produced as described above. Similarly, U3, U4, and S2 are formed. The coordinates are then
and
For spheres in higher dimensions, K independent normal deviates are generated and scaled so as to lie on the unit sphere in the manner suggested by Muller (1959).
Example
In this example, imsls_f_random_sphere is used to generate two uniform random deviates from the surface of the unit sphere in three space.
 
#include <imsls.h>
 
int main()
{
int n_random = 2;
int k = 3;
float *z;
char *rlabel[] = {"First point", "Second point"};
 
imsls_random_seed_set(123457);
 
z = imsls_f_random_sphere(n_random, k,
0);
 
imsls_f_write_matrix("Coordinates", n_random, k, z,
IMSLS_ROW_LABELS, rlabel,
IMSLS_NO_COL_LABELS,
0);
}
Output
 
Coordinates
First point 0.8893 0.2316 0.3944
Second point 0.1901 0.0396 -0.9810