Generates a simple pseudorandom sample of indices.
int *imsls_random_sample_indices (int nsamp, int npop, ..., 0)
int
nsamp (Input)
Sample size
desired.
int
npop (Input)
Number of items in the
population.
An array of length nsamp containing the indices of the sample. To release this space, use free.
int
*imsls_random_sample_indices (int
nsamp, int npop,
IMSLS_RETURN_USER, int ir[],
0)
IMSLS_RETURN_USER,
int ir[]
(Output)
User-supplied array of length nsamp containing the indices of the sample.
Routine imsls_random_sample_indices generates the indices of a pseudorandom sample,without replacement, of size nsamp numbers from a population of size npop. If nsamp is greater than npop/2, the integers from 1 to npop are selected sequentially with a probability conditional on the number selected and the number remaining to be considered. If, when the i-th population index is considered, j items have been included in the sample, then the index i is included with probability (nsamp - j)/(npop + 1 - i).
If nsamp is not greater than npop/2, a O(nsamp) algorithm due to Ahrens and Dieter (1985) is used. Of the methods discussed by Ahrens and Dieter, the one called SG* is used in imsls_random_sample_indices. It involves a preliminary selection of q indices using a geometric distribution for the distances between each index and the next one. If the preliminary sample size q is less than nsamp, a new preliminary sample is chosen, and this is continued until a preliminary sample greater in size than nsamp is chosen. This preliminary sample is then thinned using the same kind of sampling as described above for the case in which the sample size is greater than half of the population size. Routine imsls_random_sample_indices does not store the preliminary sample indices, but rather restores the state of the generator used in selecting the sample initially, and then passes through once again, making the final selection as the preliminary sample indices are being generated.
In this example, imsls_random_sample_indices is used to generate the indices of a pseudorandom sample of size 5 from a population of size 100.
int *ir, nsamp = 5, npop = 100;
imsls_random_seed_set(123457);
ir = imsls_random_sample_indices(nsamp, npop, 0);
imsls_i_write_matrix("Random Sample", 1, nsamp, ir,
Visual Numerics, Inc. PHONE: 713.784.3131 FAX:713.781.9260 |