Draw samples from an exponential distribution.

This docstring was copied from numpy.random.mtrand.RandomState.exponential.

Some inconsistencies with the Dask version may exist.

Its probability density function is

$f(x; \frac{1}{\beta}) = \frac{1}{\beta} \exp(-\frac{x}{\beta}),$

for x > 0 and 0 elsewhere. $$\beta$$ is the scale parameter, which is the inverse of the rate parameter $$\lambda = 1/\beta$$. The rate parameter is an alternative, widely used parameterization of the exponential distribution [3].

The exponential distribution is a continuous analogue of the geometric distribution. It describes many common situations, such as the size of raindrops measured over many rainstorms [1], or the time between page requests to Wikipedia [2].

Note

New code should use the ~numpy.random.Generator.exponential method of a ~numpy.random.Generator instance instead; please see the Quick Start.

Parameters
scalefloat or array_like of floats

The scale parameter, $$\beta = 1/\lambda$$. Must be non-negative.

sizeint or tuple of ints, optional

Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn. If size is None (default), a single value is returned if scale is a scalar. Otherwise, np.array(scale).size samples are drawn.

Returns
outndarray or scalar

Drawn samples from the parameterized exponential distribution.

random.Generator.exponential

which should be used for new code.

References

1

Peyton Z. Peebles Jr., “Probability, Random Variables and Random Signal Principles”, 4th ed, 2001, p. 57.

2

Wikipedia, “Poisson process”, https://en.wikipedia.org/wiki/Poisson_process

3

Wikipedia, “Exponential distribution”, https://en.wikipedia.org/wiki/Exponential_distribution

Examples

A real world example: Assume a company has 10000 customer support agents and the average time between customer calls is 4 minutes.

>>> n = 10000
>>> time_between_calls = np.random.default_rng().exponential(scale=4, size=n)


What is the probability that a customer will call in the next 4 to 5 minutes?

>>> x = ((time_between_calls < 5).sum())/n
>>> y = ((time_between_calls < 4).sum())/n
>>> x-y
0.08 # may vary