-
-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Random distribution sampling #416
Merged
sharkdp
merged 17 commits into
sharkdp:master
from
Bzero:continuous_uniform_distribution_sampling
May 1, 2024
Merged
Changes from all commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
08c6c41
Add continuous uniform distribution sampling.
Bzero 0729b6a
Add description for random().
Bzero 256b87a
Add description for rand_uniform().
Bzero 009b871
Add discrete uniform distribution sampling
Bzero ffe845a
Add normal distribution sampling
Bzero 16a7985
Add geometric distribution sampling
Bzero 25b77c8
Add exponential distribution sampling
Bzero d839647
Add log-normal distribution sampling
Bzero 18ccb0c
Add pareto distribution sampling
Bzero 1246a9a
Add Bernoulli distribution sampling
Bzero d7ecad4
Add Binomial distribution sampling
Bzero 7f6c416
Add Poisson distribution sampling
Bzero 8b92a04
Add random sampling functions to the list of predefined functions
Bzero 1acdb8c
Correct spelling
Bzero fec86cf
Turn rand_poisson() and rand_int() into scalar functions.
Bzero 23ea3ff
Merge branch 'master'
Bzero d373f78
Use error() instead of NaN and make error messages more explicit in r…
Bzero File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,102 @@ | ||
use core::scalar | ||
use core::quantities | ||
use core::error | ||
use core::functions | ||
use math::functions | ||
|
||
# name: Standard uniform distribution sampling | ||
# description: Uniformly samples the interval [0,1). | ||
fn random() -> Scalar | ||
|
||
# name: Continuous uniform distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Continuous_uniform_distribution | ||
# description: Uniformly samples the interval [a,b) if a<=b or [b,a) if b<a using inversion sampling. | ||
fn rand_uniform<T>(a: T, b: T) -> T = | ||
if a <= b | ||
then random() * (b - a) + a | ||
else random() * (a - b) + b | ||
|
||
# name: Discrete uniform distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Discrete_uniform_distribution | ||
# description: Uniformly samples the integers in the interval [a, b]. | ||
fn rand_int(a: Scalar, b: Scalar) -> Scalar = | ||
if a <= b | ||
then floor( random() * (floor(b) - ceil(a) + 1) ) + ceil(a) | ||
else floor( random() * (floor(a) - ceil(b) + 1) ) + ceil(b) | ||
|
||
# name: Bernoulli distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Bernoulli_distribution | ||
# description: Samples a Bernoulli random variable, that is, 1 with probability p, 0 with probability 1-p. | ||
# Parameter p must be a probability (0 <= p <= 1). | ||
fn rand_bernoulli(p: Scalar) -> Scalar = | ||
if p>=0 && p<=1 | ||
then (if random() < p | ||
then 1 | ||
else 0) | ||
else error("Argument p must be a probability (0 <= p <= 1).") | ||
|
||
# name: Binomial distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Binomial_distribution | ||
# description: Samples a binomial distribution by doing n Bernoulli trials with probability p. | ||
# Parameter n must be a positive integer, parameter p must be a probability (0 <= p <= 1). | ||
fn rand_binom(n: Scalar, p: Scalar) -> Scalar = | ||
if n >= 1 | ||
then rand_binom(n-1, p) + rand_bernoulli(p) | ||
else if n == 0 | ||
then 0 | ||
else error("Argument n must be a positive integer.") | ||
|
||
# name: Normal distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Normal_distribution | ||
# description: Samples a normal distribution with mean μ and standard deviation σ using the Box-Muller transform. | ||
fn rand_norm<T>(μ: T, σ: T) -> T = | ||
μ + sqrt(-2 σ² × ln(random())) × sin(2π × random()) | ||
|
||
# name: Geometric distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Geometric_distribution | ||
# description: Samples a geometric distribution (the distribution of the number of Bernoulli trials with probability p needed to get one success) by inversion sampling. | ||
# Parameter p must be a probability (0 <= p <= 1). | ||
fn rand_geom(p: Scalar) -> Scalar = | ||
if p>=0 && p<=1 | ||
then ceil( ln(1-random()) / ln(1-p) ) | ||
else error("Argument p must be a probability (0 <= p <= 1).") | ||
|
||
# A helper function for rand_poisson, counts how many samples of the standard uniform distribution need to be multiplied to fall below lim. | ||
fn _poisson(lim: Scalar, prod: Scalar) -> Scalar = | ||
if prod > lim | ||
then _poisson(lim, prod × random()) + 1 | ||
else -1 | ||
|
||
# name: Poisson distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Poisson_distribution | ||
# description: Sampling a poisson distribution with rate λ, that is, the distribution of the number of events occurring in a fixed interval if these events occur with mean rate λ. | ||
# The rate parameter λ must not be negative. | ||
# This implementation is based on the exponential distribution of inter-arrival times. For details see L. Devroye, Non-Uniform Random Variate Generation, p. 504, Lemma 3.3. | ||
fn rand_poisson(λ: Scalar) -> Scalar = | ||
if λ >= 0 | ||
then _poisson(exp(-λ), 1) | ||
else error("Argument λ must not be negative.") | ||
|
||
# name: Exponential distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Exponential_distribution | ||
# description: Sampling an exponential distribution (the distribution of the distance between events in a Poisson process with rate λ) using inversion sampling. | ||
# The rate parameter λ must be positive. | ||
fn rand_expon<T>(λ: T) -> 1/T = | ||
if value_of(λ) > 0 | ||
then - ln(1-random()) / λ | ||
else error("Argument λ must be positive.") | ||
|
||
# name: Log-normal distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Log-normal_distribution | ||
# description: Sampling a log-normal distribution, that is, a distribution whose log is a normal distribution with mean μ and standard deviation σ. | ||
fn rand_lognorm(μ: Scalar, σ: Scalar) -> Scalar = | ||
exp( μ + σ × rand_norm(0, 1) ) | ||
|
||
# name: Pareto distribution sampling | ||
# url: https://en.wikipedia.org/wiki/Pareto_distribution | ||
# description: Sampling a Pareto distribution with minimum value min and shape parameter α using inversion sampling. | ||
# Both parameters α and min must be positive. | ||
fn rand_pareto<T>(α: Scalar, min: T) -> T = | ||
if value_of(min) > 0 && α > 0 | ||
then min / ((1-random())^(1/α)) | ||
else error("Both arguments α and min must be positive.") |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😍