random_cauchy

Generates pseudorandom numbers from a Cauchy distribution.

Synopsis

#include <imsls.h>

float *imsls_f_random_cauchy(int n_random, 0)

The type double function is imsls_d_random_cauchy.

Required Arguments

int n_random (Input)
Number of random numbers to generate.

Return Value

An array of length n_random containing the random Cauchy deviates.

Synopsis with Optional Arguments

#include <imsls.h>

float *imsls_f_random_cauchy (int n_random,
IMSLS_RETURN_USER, float r[],
0)

Optional Arguments

IMSLS_RETURN_USER, float r[] (Output)
User-supplied array of length n_random containing the random Cauchy deviates.

Description

Function imsls_f_random_cauchy generates pseudorandom numbers from a Cauchy distribution. The probability density function is

 

where T is the median and T  S is the first quartile. This function first generates standard Cauchy random numbers (T = 0 and S = 1) using the technique described below, and then scales the values using T and S.

Use of the inverse CDF technique would yield a Cauchy deviate from a uniform (0, 1) deviate, u, as tan [π (u  0.5)]. Rather than evaluating a tangent directly, however, random_cauchy generates two uniform (1, 1) deviates, x1 and x2. These values can be thought of as sine and cosine values. If

 

is less than or equal to 1, then x1/x2 is delivered as the unscaled Cauchy deviate; otherwise, x1 and x2 are rejected and two new uniform (1, 1) deviates are generated. This method is also equivalent to taking the ration of two independent normal deviates.

Example

In this example, imsls_f_random_cauchy generates five pseudorandom Cauchy numbers. The generator used is a simple multiplicative congruential with a multiplier of 16807.

 

#include <imsls.h>

#include <stdio.h>

 

int main()

{

int n_random = 5;

float *r;

 

imsls_random_seed_set(123457);

r = imsls_f_random_cauchy(n_random, 0);

printf("Cauchy random deviates: %8.4f%8.4f%8.4f%8.4f%8.4f\n",

r[0], r[1], r[2], r[3], r[4]);

 

}

Output

 

Cauchy random deviates: 3.5765 0.9353 15.5797 2.0815 -0.1333