Learn R Programming

physx (version 1.0)

rng: Random number generator for a custom d-dimensional distribution

Description

Brute-force algorithm for drawing random numbers from a d-dimensional distribution.

Usage

rng(f, n, min, max, fmax = NULL, seed = NULL, warn = TRUE)

Arguments

f

function of a d-vector representing a d-dimensional distribution function. This function must be non-negative on the whole domain. It does not need to be normalized. For fast performance, this function should be vectorized, such that it returns an N-element vector if it is given an N-by-D matrix as argument. An automatic warning is produced if the function is not vectorized in this manner.

n

number of random numbers to be generated

min, max

are d-vectors specifying the domain of distribution function; the domain must be finite and should be as restrictive as possible to keep the number of random trials as low as possible.

fmax

maximum value of f on its domain. If set to NULL (default), this value will be determined automatically, using the optimize (if d=1) and optim (if d>1) function with its default options. A value for fmax should be set, if the automatically determined value (see output list) is incorrect.

seed

optional seed for random number generator.

warn

logical flag. If true (default), a warning is produced if the function f is not vectorized.

Value

Returns list of items:

x

n-by-d matrix of n random d-vectors.

fmax

maximum value of the distribution function f on the domain.

n

number of random vectors (same as argument n).

ntrials

number of trials.

See Also

dpqr

Examples

Run this code
# NOT RUN {
## 1D random number generation (sin-function)
f = function(x) sin(x)
out = rng(f,1e3,0,pi)
hist(out$x,freq=FALSE,xlab='x')
curve(sin(x)/2,0,pi,add=TRUE)

## 5D random number generation (5-dimensional sphere)
f = function(x) as.numeric(sum(x^2)<=1)
out = rng(f,1e4,rep(-1,5),rep(1,5))
cat(sprintf('Number of successes over number of trials : %.4f\n',out$n/out$ntrials))
cat(sprintf('Expected ratio for n=\u221E : %.4f\n',pi^(5/2)/gamma(1+5/2)/2^5))

# }

Run the code above in your browser using DataLab