1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: distributions.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This header defines functions representing distributions, which you use in
20*9356374aSAndroid Build Coastguard Worker // combination with an Abseil random bit generator to produce random values
21*9356374aSAndroid Build Coastguard Worker // according to the rules of that distribution.
22*9356374aSAndroid Build Coastguard Worker //
23*9356374aSAndroid Build Coastguard Worker // The Abseil random library defines the following distributions within this
24*9356374aSAndroid Build Coastguard Worker // file:
25*9356374aSAndroid Build Coastguard Worker //
26*9356374aSAndroid Build Coastguard Worker // * `absl::Uniform` for uniform (constant) distributions having constant
27*9356374aSAndroid Build Coastguard Worker // probability
28*9356374aSAndroid Build Coastguard Worker // * `absl::Bernoulli` for discrete distributions having exactly two outcomes
29*9356374aSAndroid Build Coastguard Worker // * `absl::Beta` for continuous distributions parameterized through two
30*9356374aSAndroid Build Coastguard Worker // free parameters
31*9356374aSAndroid Build Coastguard Worker // * `absl::Exponential` for discrete distributions of events occurring
32*9356374aSAndroid Build Coastguard Worker // continuously and independently at a constant average rate
33*9356374aSAndroid Build Coastguard Worker // * `absl::Gaussian` (also known as "normal distributions") for continuous
34*9356374aSAndroid Build Coastguard Worker // distributions using an associated quadratic function
35*9356374aSAndroid Build Coastguard Worker // * `absl::LogUniform` for discrete distributions where the log to the given
36*9356374aSAndroid Build Coastguard Worker // base of all values is uniform
37*9356374aSAndroid Build Coastguard Worker // * `absl::Poisson` for discrete probability distributions that express the
38*9356374aSAndroid Build Coastguard Worker // probability of a given number of events occurring within a fixed interval
39*9356374aSAndroid Build Coastguard Worker // * `absl::Zipf` for discrete probability distributions commonly used for
40*9356374aSAndroid Build Coastguard Worker // modelling of rare events
41*9356374aSAndroid Build Coastguard Worker //
42*9356374aSAndroid Build Coastguard Worker // Prefer use of these distribution function classes over manual construction of
43*9356374aSAndroid Build Coastguard Worker // your own distribution classes, as it allows library maintainers greater
44*9356374aSAndroid Build Coastguard Worker // flexibility to change the underlying implementation in the future.
45*9356374aSAndroid Build Coastguard Worker
46*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_RANDOM_DISTRIBUTIONS_H_
47*9356374aSAndroid Build Coastguard Worker #define ABSL_RANDOM_DISTRIBUTIONS_H_
48*9356374aSAndroid Build Coastguard Worker
49*9356374aSAndroid Build Coastguard Worker #include <limits>
50*9356374aSAndroid Build Coastguard Worker #include <type_traits>
51*9356374aSAndroid Build Coastguard Worker
52*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
53*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/inline_variable.h"
54*9356374aSAndroid Build Coastguard Worker #include "absl/meta/type_traits.h"
55*9356374aSAndroid Build Coastguard Worker #include "absl/random/bernoulli_distribution.h"
56*9356374aSAndroid Build Coastguard Worker #include "absl/random/beta_distribution.h"
57*9356374aSAndroid Build Coastguard Worker #include "absl/random/exponential_distribution.h"
58*9356374aSAndroid Build Coastguard Worker #include "absl/random/gaussian_distribution.h"
59*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/distribution_caller.h" // IWYU pragma: export
60*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/traits.h"
61*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/uniform_helper.h" // IWYU pragma: export
62*9356374aSAndroid Build Coastguard Worker #include "absl/random/log_uniform_int_distribution.h"
63*9356374aSAndroid Build Coastguard Worker #include "absl/random/poisson_distribution.h"
64*9356374aSAndroid Build Coastguard Worker #include "absl/random/uniform_int_distribution.h" // IWYU pragma: export
65*9356374aSAndroid Build Coastguard Worker #include "absl/random/uniform_real_distribution.h" // IWYU pragma: export
66*9356374aSAndroid Build Coastguard Worker #include "absl/random/zipf_distribution.h"
67*9356374aSAndroid Build Coastguard Worker
68*9356374aSAndroid Build Coastguard Worker namespace absl {
69*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
70*9356374aSAndroid Build Coastguard Worker
71*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedClosedTag, IntervalClosedClosed,
72*9356374aSAndroid Build Coastguard Worker {});
73*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedClosedTag, IntervalClosed, {});
74*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalClosedOpenTag, IntervalClosedOpen, {});
75*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenOpenTag, IntervalOpenOpen, {});
76*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenOpenTag, IntervalOpen, {});
77*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_INLINE_CONSTEXPR(IntervalOpenClosedTag, IntervalOpenClosed, {});
78*9356374aSAndroid Build Coastguard Worker
79*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
80*9356374aSAndroid Build Coastguard Worker // absl::Uniform<T>(tag, bitgen, lo, hi)
81*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
82*9356374aSAndroid Build Coastguard Worker //
83*9356374aSAndroid Build Coastguard Worker // `absl::Uniform()` produces random values of type `T` uniformly distributed in
84*9356374aSAndroid Build Coastguard Worker // a defined interval {lo, hi}. The interval `tag` defines the type of interval
85*9356374aSAndroid Build Coastguard Worker // which should be one of the following possible values:
86*9356374aSAndroid Build Coastguard Worker //
87*9356374aSAndroid Build Coastguard Worker // * `absl::IntervalOpenOpen`
88*9356374aSAndroid Build Coastguard Worker // * `absl::IntervalOpenClosed`
89*9356374aSAndroid Build Coastguard Worker // * `absl::IntervalClosedOpen`
90*9356374aSAndroid Build Coastguard Worker // * `absl::IntervalClosedClosed`
91*9356374aSAndroid Build Coastguard Worker //
92*9356374aSAndroid Build Coastguard Worker // where "open" refers to an exclusive value (excluded) from the output, while
93*9356374aSAndroid Build Coastguard Worker // "closed" refers to an inclusive value (included) from the output.
94*9356374aSAndroid Build Coastguard Worker //
95*9356374aSAndroid Build Coastguard Worker // In the absence of an explicit return type `T`, `absl::Uniform()` will deduce
96*9356374aSAndroid Build Coastguard Worker // the return type based on the provided endpoint arguments {A lo, B hi}.
97*9356374aSAndroid Build Coastguard Worker // Given these endpoints, one of {A, B} will be chosen as the return type, if
98*9356374aSAndroid Build Coastguard Worker // a type can be implicitly converted into the other in a lossless way. The
99*9356374aSAndroid Build Coastguard Worker // lack of any such implicit conversion between {A, B} will produce a
100*9356374aSAndroid Build Coastguard Worker // compile-time error
101*9356374aSAndroid Build Coastguard Worker //
102*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)
103*9356374aSAndroid Build Coastguard Worker //
104*9356374aSAndroid Build Coastguard Worker // Example:
105*9356374aSAndroid Build Coastguard Worker //
106*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
107*9356374aSAndroid Build Coastguard Worker //
108*9356374aSAndroid Build Coastguard Worker // // Produce a random float value between 0.0 and 1.0, inclusive
109*9356374aSAndroid Build Coastguard Worker // auto x = absl::Uniform(absl::IntervalClosedClosed, bitgen, 0.0f, 1.0f);
110*9356374aSAndroid Build Coastguard Worker //
111*9356374aSAndroid Build Coastguard Worker // // The most common interval of `absl::IntervalClosedOpen` is available by
112*9356374aSAndroid Build Coastguard Worker // // default:
113*9356374aSAndroid Build Coastguard Worker //
114*9356374aSAndroid Build Coastguard Worker // auto x = absl::Uniform(bitgen, 0.0f, 1.0f);
115*9356374aSAndroid Build Coastguard Worker //
116*9356374aSAndroid Build Coastguard Worker // // Return-types are typically inferred from the arguments, however callers
117*9356374aSAndroid Build Coastguard Worker // // can optionally provide an explicit return-type to the template.
118*9356374aSAndroid Build Coastguard Worker //
119*9356374aSAndroid Build Coastguard Worker // auto x = absl::Uniform<float>(bitgen, 0, 1);
120*9356374aSAndroid Build Coastguard Worker //
121*9356374aSAndroid Build Coastguard Worker template <typename R = void, typename TagType, typename URBG>
122*9356374aSAndroid Build Coastguard Worker typename absl::enable_if_t<!std::is_same<R, void>::value, R> //
Uniform(TagType tag,URBG && urbg,R lo,R hi)123*9356374aSAndroid Build Coastguard Worker Uniform(TagType tag,
124*9356374aSAndroid Build Coastguard Worker URBG&& urbg, // NOLINT(runtime/references)
125*9356374aSAndroid Build Coastguard Worker R lo, R hi) {
126*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
127*9356374aSAndroid Build Coastguard Worker using distribution_t = random_internal::UniformDistributionWrapper<R>;
128*9356374aSAndroid Build Coastguard Worker
129*9356374aSAndroid Build Coastguard Worker auto a = random_internal::uniform_lower_bound(tag, lo, hi);
130*9356374aSAndroid Build Coastguard Worker auto b = random_internal::uniform_upper_bound(tag, lo, hi);
131*9356374aSAndroid Build Coastguard Worker if (!random_internal::is_uniform_range_valid(a, b)) return lo;
132*9356374aSAndroid Build Coastguard Worker
133*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
134*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, tag, lo, hi);
135*9356374aSAndroid Build Coastguard Worker }
136*9356374aSAndroid Build Coastguard Worker
137*9356374aSAndroid Build Coastguard Worker // absl::Uniform<T>(bitgen, lo, hi)
138*9356374aSAndroid Build Coastguard Worker //
139*9356374aSAndroid Build Coastguard Worker // Overload of `Uniform()` using the default closed-open interval of [lo, hi),
140*9356374aSAndroid Build Coastguard Worker // and returning values of type `T`
141*9356374aSAndroid Build Coastguard Worker template <typename R = void, typename URBG>
142*9356374aSAndroid Build Coastguard Worker typename absl::enable_if_t<!std::is_same<R, void>::value, R> //
Uniform(URBG && urbg,R lo,R hi)143*9356374aSAndroid Build Coastguard Worker Uniform(URBG&& urbg, // NOLINT(runtime/references)
144*9356374aSAndroid Build Coastguard Worker R lo, R hi) {
145*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
146*9356374aSAndroid Build Coastguard Worker using distribution_t = random_internal::UniformDistributionWrapper<R>;
147*9356374aSAndroid Build Coastguard Worker constexpr auto tag = absl::IntervalClosedOpen;
148*9356374aSAndroid Build Coastguard Worker
149*9356374aSAndroid Build Coastguard Worker auto a = random_internal::uniform_lower_bound(tag, lo, hi);
150*9356374aSAndroid Build Coastguard Worker auto b = random_internal::uniform_upper_bound(tag, lo, hi);
151*9356374aSAndroid Build Coastguard Worker if (!random_internal::is_uniform_range_valid(a, b)) return lo;
152*9356374aSAndroid Build Coastguard Worker
153*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
154*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, lo, hi);
155*9356374aSAndroid Build Coastguard Worker }
156*9356374aSAndroid Build Coastguard Worker
157*9356374aSAndroid Build Coastguard Worker // absl::Uniform(tag, bitgen, lo, hi)
158*9356374aSAndroid Build Coastguard Worker //
159*9356374aSAndroid Build Coastguard Worker // Overload of `Uniform()` using different (but compatible) lo, hi types. Note
160*9356374aSAndroid Build Coastguard Worker // that a compile-error will result if the return type cannot be deduced
161*9356374aSAndroid Build Coastguard Worker // correctly from the passed types.
162*9356374aSAndroid Build Coastguard Worker template <typename R = void, typename TagType, typename URBG, typename A,
163*9356374aSAndroid Build Coastguard Worker typename B>
164*9356374aSAndroid Build Coastguard Worker typename absl::enable_if_t<std::is_same<R, void>::value,
165*9356374aSAndroid Build Coastguard Worker random_internal::uniform_inferred_return_t<A, B>>
Uniform(TagType tag,URBG && urbg,A lo,B hi)166*9356374aSAndroid Build Coastguard Worker Uniform(TagType tag,
167*9356374aSAndroid Build Coastguard Worker URBG&& urbg, // NOLINT(runtime/references)
168*9356374aSAndroid Build Coastguard Worker A lo, B hi) {
169*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
170*9356374aSAndroid Build Coastguard Worker using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
171*9356374aSAndroid Build Coastguard Worker using distribution_t = random_internal::UniformDistributionWrapper<return_t>;
172*9356374aSAndroid Build Coastguard Worker
173*9356374aSAndroid Build Coastguard Worker auto a = random_internal::uniform_lower_bound<return_t>(tag, lo, hi);
174*9356374aSAndroid Build Coastguard Worker auto b = random_internal::uniform_upper_bound<return_t>(tag, lo, hi);
175*9356374aSAndroid Build Coastguard Worker if (!random_internal::is_uniform_range_valid(a, b)) return lo;
176*9356374aSAndroid Build Coastguard Worker
177*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
178*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, tag, static_cast<return_t>(lo),
179*9356374aSAndroid Build Coastguard Worker static_cast<return_t>(hi));
180*9356374aSAndroid Build Coastguard Worker }
181*9356374aSAndroid Build Coastguard Worker
182*9356374aSAndroid Build Coastguard Worker // absl::Uniform(bitgen, lo, hi)
183*9356374aSAndroid Build Coastguard Worker //
184*9356374aSAndroid Build Coastguard Worker // Overload of `Uniform()` using different (but compatible) lo, hi types and the
185*9356374aSAndroid Build Coastguard Worker // default closed-open interval of [lo, hi). Note that a compile-error will
186*9356374aSAndroid Build Coastguard Worker // result if the return type cannot be deduced correctly from the passed types.
187*9356374aSAndroid Build Coastguard Worker template <typename R = void, typename URBG, typename A, typename B>
188*9356374aSAndroid Build Coastguard Worker typename absl::enable_if_t<std::is_same<R, void>::value,
189*9356374aSAndroid Build Coastguard Worker random_internal::uniform_inferred_return_t<A, B>>
Uniform(URBG && urbg,A lo,B hi)190*9356374aSAndroid Build Coastguard Worker Uniform(URBG&& urbg, // NOLINT(runtime/references)
191*9356374aSAndroid Build Coastguard Worker A lo, B hi) {
192*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
193*9356374aSAndroid Build Coastguard Worker using return_t = typename random_internal::uniform_inferred_return_t<A, B>;
194*9356374aSAndroid Build Coastguard Worker using distribution_t = random_internal::UniformDistributionWrapper<return_t>;
195*9356374aSAndroid Build Coastguard Worker
196*9356374aSAndroid Build Coastguard Worker constexpr auto tag = absl::IntervalClosedOpen;
197*9356374aSAndroid Build Coastguard Worker auto a = random_internal::uniform_lower_bound<return_t>(tag, lo, hi);
198*9356374aSAndroid Build Coastguard Worker auto b = random_internal::uniform_upper_bound<return_t>(tag, lo, hi);
199*9356374aSAndroid Build Coastguard Worker if (!random_internal::is_uniform_range_valid(a, b)) return lo;
200*9356374aSAndroid Build Coastguard Worker
201*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
202*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, static_cast<return_t>(lo),
203*9356374aSAndroid Build Coastguard Worker static_cast<return_t>(hi));
204*9356374aSAndroid Build Coastguard Worker }
205*9356374aSAndroid Build Coastguard Worker
206*9356374aSAndroid Build Coastguard Worker // absl::Uniform<unsigned T>(bitgen)
207*9356374aSAndroid Build Coastguard Worker //
208*9356374aSAndroid Build Coastguard Worker // Overload of Uniform() using the minimum and maximum values of a given type
209*9356374aSAndroid Build Coastguard Worker // `T` (which must be unsigned), returning a value of type `unsigned T`
210*9356374aSAndroid Build Coastguard Worker template <typename R, typename URBG>
211*9356374aSAndroid Build Coastguard Worker typename absl::enable_if_t<!std::numeric_limits<R>::is_signed, R> //
Uniform(URBG && urbg)212*9356374aSAndroid Build Coastguard Worker Uniform(URBG&& urbg) { // NOLINT(runtime/references)
213*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
214*9356374aSAndroid Build Coastguard Worker using distribution_t = random_internal::UniformDistributionWrapper<R>;
215*9356374aSAndroid Build Coastguard Worker
216*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
217*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg);
218*9356374aSAndroid Build Coastguard Worker }
219*9356374aSAndroid Build Coastguard Worker
220*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
221*9356374aSAndroid Build Coastguard Worker // absl::Bernoulli(bitgen, p)
222*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
223*9356374aSAndroid Build Coastguard Worker //
224*9356374aSAndroid Build Coastguard Worker // `absl::Bernoulli` produces a random boolean value, with probability `p`
225*9356374aSAndroid Build Coastguard Worker // (where 0.0 <= p <= 1.0) equaling `true`.
226*9356374aSAndroid Build Coastguard Worker //
227*9356374aSAndroid Build Coastguard Worker // Prefer `absl::Bernoulli` to produce boolean values over other alternatives
228*9356374aSAndroid Build Coastguard Worker // such as comparing an `absl::Uniform()` value to a specific output.
229*9356374aSAndroid Build Coastguard Worker //
230*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Bernoulli_distribution
231*9356374aSAndroid Build Coastguard Worker //
232*9356374aSAndroid Build Coastguard Worker // Example:
233*9356374aSAndroid Build Coastguard Worker //
234*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
235*9356374aSAndroid Build Coastguard Worker // ...
236*9356374aSAndroid Build Coastguard Worker // if (absl::Bernoulli(bitgen, 1.0/3721.0)) {
237*9356374aSAndroid Build Coastguard Worker // std::cout << "Asteroid field navigation successful.";
238*9356374aSAndroid Build Coastguard Worker // }
239*9356374aSAndroid Build Coastguard Worker //
240*9356374aSAndroid Build Coastguard Worker template <typename URBG>
Bernoulli(URBG && urbg,double p)241*9356374aSAndroid Build Coastguard Worker bool Bernoulli(URBG&& urbg, // NOLINT(runtime/references)
242*9356374aSAndroid Build Coastguard Worker double p) {
243*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
244*9356374aSAndroid Build Coastguard Worker using distribution_t = absl::bernoulli_distribution;
245*9356374aSAndroid Build Coastguard Worker
246*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
247*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, p);
248*9356374aSAndroid Build Coastguard Worker }
249*9356374aSAndroid Build Coastguard Worker
250*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
251*9356374aSAndroid Build Coastguard Worker // absl::Beta<T>(bitgen, alpha, beta)
252*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
253*9356374aSAndroid Build Coastguard Worker //
254*9356374aSAndroid Build Coastguard Worker // `absl::Beta` produces a floating point number distributed in the closed
255*9356374aSAndroid Build Coastguard Worker // interval [0,1] and parameterized by two values `alpha` and `beta` as per a
256*9356374aSAndroid Build Coastguard Worker // Beta distribution. `T` must be a floating point type, but may be inferred
257*9356374aSAndroid Build Coastguard Worker // from the types of `alpha` and `beta`.
258*9356374aSAndroid Build Coastguard Worker //
259*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Beta_distribution.
260*9356374aSAndroid Build Coastguard Worker //
261*9356374aSAndroid Build Coastguard Worker // Example:
262*9356374aSAndroid Build Coastguard Worker //
263*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
264*9356374aSAndroid Build Coastguard Worker // ...
265*9356374aSAndroid Build Coastguard Worker // double sample = absl::Beta(bitgen, 3.0, 2.0);
266*9356374aSAndroid Build Coastguard Worker //
267*9356374aSAndroid Build Coastguard Worker template <typename RealType, typename URBG>
Beta(URBG && urbg,RealType alpha,RealType beta)268*9356374aSAndroid Build Coastguard Worker RealType Beta(URBG&& urbg, // NOLINT(runtime/references)
269*9356374aSAndroid Build Coastguard Worker RealType alpha, RealType beta) {
270*9356374aSAndroid Build Coastguard Worker static_assert(
271*9356374aSAndroid Build Coastguard Worker std::is_floating_point<RealType>::value,
272*9356374aSAndroid Build Coastguard Worker "Template-argument 'RealType' must be a floating-point type, in "
273*9356374aSAndroid Build Coastguard Worker "absl::Beta<RealType, URBG>(...)");
274*9356374aSAndroid Build Coastguard Worker
275*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
276*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::beta_distribution<RealType>;
277*9356374aSAndroid Build Coastguard Worker
278*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
279*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, alpha, beta);
280*9356374aSAndroid Build Coastguard Worker }
281*9356374aSAndroid Build Coastguard Worker
282*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
283*9356374aSAndroid Build Coastguard Worker // absl::Exponential<T>(bitgen, lambda = 1)
284*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
285*9356374aSAndroid Build Coastguard Worker //
286*9356374aSAndroid Build Coastguard Worker // `absl::Exponential` produces a floating point number representing the
287*9356374aSAndroid Build Coastguard Worker // distance (time) between two consecutive events in a point process of events
288*9356374aSAndroid Build Coastguard Worker // occurring continuously and independently at a constant average rate. `T` must
289*9356374aSAndroid Build Coastguard Worker // be a floating point type, but may be inferred from the type of `lambda`.
290*9356374aSAndroid Build Coastguard Worker //
291*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Exponential_distribution.
292*9356374aSAndroid Build Coastguard Worker //
293*9356374aSAndroid Build Coastguard Worker // Example:
294*9356374aSAndroid Build Coastguard Worker //
295*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
296*9356374aSAndroid Build Coastguard Worker // ...
297*9356374aSAndroid Build Coastguard Worker // double call_length = absl::Exponential(bitgen, 7.0);
298*9356374aSAndroid Build Coastguard Worker //
299*9356374aSAndroid Build Coastguard Worker template <typename RealType, typename URBG>
300*9356374aSAndroid Build Coastguard Worker RealType Exponential(URBG&& urbg, // NOLINT(runtime/references)
301*9356374aSAndroid Build Coastguard Worker RealType lambda = 1) {
302*9356374aSAndroid Build Coastguard Worker static_assert(
303*9356374aSAndroid Build Coastguard Worker std::is_floating_point<RealType>::value,
304*9356374aSAndroid Build Coastguard Worker "Template-argument 'RealType' must be a floating-point type, in "
305*9356374aSAndroid Build Coastguard Worker "absl::Exponential<RealType, URBG>(...)");
306*9356374aSAndroid Build Coastguard Worker
307*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
308*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::exponential_distribution<RealType>;
309*9356374aSAndroid Build Coastguard Worker
310*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
311*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, lambda);
312*9356374aSAndroid Build Coastguard Worker }
313*9356374aSAndroid Build Coastguard Worker
314*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
315*9356374aSAndroid Build Coastguard Worker // absl::Gaussian<T>(bitgen, mean = 0, stddev = 1)
316*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
317*9356374aSAndroid Build Coastguard Worker //
318*9356374aSAndroid Build Coastguard Worker // `absl::Gaussian` produces a floating point number selected from the Gaussian
319*9356374aSAndroid Build Coastguard Worker // (ie. "Normal") distribution. `T` must be a floating point type, but may be
320*9356374aSAndroid Build Coastguard Worker // inferred from the types of `mean` and `stddev`.
321*9356374aSAndroid Build Coastguard Worker //
322*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Normal_distribution
323*9356374aSAndroid Build Coastguard Worker //
324*9356374aSAndroid Build Coastguard Worker // Example:
325*9356374aSAndroid Build Coastguard Worker //
326*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
327*9356374aSAndroid Build Coastguard Worker // ...
328*9356374aSAndroid Build Coastguard Worker // double giraffe_height = absl::Gaussian(bitgen, 16.3, 3.3);
329*9356374aSAndroid Build Coastguard Worker //
330*9356374aSAndroid Build Coastguard Worker template <typename RealType, typename URBG>
331*9356374aSAndroid Build Coastguard Worker RealType Gaussian(URBG&& urbg, // NOLINT(runtime/references)
332*9356374aSAndroid Build Coastguard Worker RealType mean = 0, RealType stddev = 1) {
333*9356374aSAndroid Build Coastguard Worker static_assert(
334*9356374aSAndroid Build Coastguard Worker std::is_floating_point<RealType>::value,
335*9356374aSAndroid Build Coastguard Worker "Template-argument 'RealType' must be a floating-point type, in "
336*9356374aSAndroid Build Coastguard Worker "absl::Gaussian<RealType, URBG>(...)");
337*9356374aSAndroid Build Coastguard Worker
338*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
339*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::gaussian_distribution<RealType>;
340*9356374aSAndroid Build Coastguard Worker
341*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
342*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, mean, stddev);
343*9356374aSAndroid Build Coastguard Worker }
344*9356374aSAndroid Build Coastguard Worker
345*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
346*9356374aSAndroid Build Coastguard Worker // absl::LogUniform<T>(bitgen, lo, hi, base = 2)
347*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
348*9356374aSAndroid Build Coastguard Worker //
349*9356374aSAndroid Build Coastguard Worker // `absl::LogUniform` produces random values distributed where the log to a
350*9356374aSAndroid Build Coastguard Worker // given base of all values is uniform in a closed interval [lo, hi]. `T` must
351*9356374aSAndroid Build Coastguard Worker // be an integral type, but may be inferred from the types of `lo` and `hi`.
352*9356374aSAndroid Build Coastguard Worker //
353*9356374aSAndroid Build Coastguard Worker // I.e., `LogUniform(0, n, b)` is uniformly distributed across buckets
354*9356374aSAndroid Build Coastguard Worker // [0], [1, b-1], [b, b^2-1] .. [b^(k-1), (b^k)-1] .. [b^floor(log(n, b)), n]
355*9356374aSAndroid Build Coastguard Worker // and is uniformly distributed within each bucket.
356*9356374aSAndroid Build Coastguard Worker //
357*9356374aSAndroid Build Coastguard Worker // The resulting probability density is inversely related to bucket size, though
358*9356374aSAndroid Build Coastguard Worker // values in the final bucket may be more likely than previous values. (In the
359*9356374aSAndroid Build Coastguard Worker // extreme case where n = b^i the final value will be tied with zero as the most
360*9356374aSAndroid Build Coastguard Worker // probable result.
361*9356374aSAndroid Build Coastguard Worker //
362*9356374aSAndroid Build Coastguard Worker // If `lo` is nonzero then this distribution is shifted to the desired interval,
363*9356374aSAndroid Build Coastguard Worker // so LogUniform(lo, hi, b) is equivalent to LogUniform(0, hi-lo, b)+lo.
364*9356374aSAndroid Build Coastguard Worker //
365*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Reciprocal_distribution
366*9356374aSAndroid Build Coastguard Worker //
367*9356374aSAndroid Build Coastguard Worker // Example:
368*9356374aSAndroid Build Coastguard Worker //
369*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
370*9356374aSAndroid Build Coastguard Worker // ...
371*9356374aSAndroid Build Coastguard Worker // int v = absl::LogUniform(bitgen, 0, 1000);
372*9356374aSAndroid Build Coastguard Worker //
373*9356374aSAndroid Build Coastguard Worker template <typename IntType, typename URBG>
374*9356374aSAndroid Build Coastguard Worker IntType LogUniform(URBG&& urbg, // NOLINT(runtime/references)
375*9356374aSAndroid Build Coastguard Worker IntType lo, IntType hi, IntType base = 2) {
376*9356374aSAndroid Build Coastguard Worker static_assert(random_internal::IsIntegral<IntType>::value,
377*9356374aSAndroid Build Coastguard Worker "Template-argument 'IntType' must be an integral type, in "
378*9356374aSAndroid Build Coastguard Worker "absl::LogUniform<IntType, URBG>(...)");
379*9356374aSAndroid Build Coastguard Worker
380*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
381*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::log_uniform_int_distribution<IntType>;
382*9356374aSAndroid Build Coastguard Worker
383*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
384*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, lo, hi, base);
385*9356374aSAndroid Build Coastguard Worker }
386*9356374aSAndroid Build Coastguard Worker
387*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
388*9356374aSAndroid Build Coastguard Worker // absl::Poisson<T>(bitgen, mean = 1)
389*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
390*9356374aSAndroid Build Coastguard Worker //
391*9356374aSAndroid Build Coastguard Worker // `absl::Poisson` produces discrete probabilities for a given number of events
392*9356374aSAndroid Build Coastguard Worker // occurring within a fixed interval within the closed interval [0, max]. `T`
393*9356374aSAndroid Build Coastguard Worker // must be an integral type.
394*9356374aSAndroid Build Coastguard Worker //
395*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Poisson_distribution
396*9356374aSAndroid Build Coastguard Worker //
397*9356374aSAndroid Build Coastguard Worker // Example:
398*9356374aSAndroid Build Coastguard Worker //
399*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
400*9356374aSAndroid Build Coastguard Worker // ...
401*9356374aSAndroid Build Coastguard Worker // int requests_per_minute = absl::Poisson<int>(bitgen, 3.2);
402*9356374aSAndroid Build Coastguard Worker //
403*9356374aSAndroid Build Coastguard Worker template <typename IntType, typename URBG>
404*9356374aSAndroid Build Coastguard Worker IntType Poisson(URBG&& urbg, // NOLINT(runtime/references)
405*9356374aSAndroid Build Coastguard Worker double mean = 1.0) {
406*9356374aSAndroid Build Coastguard Worker static_assert(random_internal::IsIntegral<IntType>::value,
407*9356374aSAndroid Build Coastguard Worker "Template-argument 'IntType' must be an integral type, in "
408*9356374aSAndroid Build Coastguard Worker "absl::Poisson<IntType, URBG>(...)");
409*9356374aSAndroid Build Coastguard Worker
410*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
411*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::poisson_distribution<IntType>;
412*9356374aSAndroid Build Coastguard Worker
413*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
414*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, mean);
415*9356374aSAndroid Build Coastguard Worker }
416*9356374aSAndroid Build Coastguard Worker
417*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
418*9356374aSAndroid Build Coastguard Worker // absl::Zipf<T>(bitgen, hi = max, q = 2, v = 1)
419*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
420*9356374aSAndroid Build Coastguard Worker //
421*9356374aSAndroid Build Coastguard Worker // `absl::Zipf` produces discrete probabilities commonly used for modelling of
422*9356374aSAndroid Build Coastguard Worker // rare events over the closed interval [0, hi]. The parameters `v` and `q`
423*9356374aSAndroid Build Coastguard Worker // determine the skew of the distribution. `T` must be an integral type, but
424*9356374aSAndroid Build Coastguard Worker // may be inferred from the type of `hi`.
425*9356374aSAndroid Build Coastguard Worker //
426*9356374aSAndroid Build Coastguard Worker // See http://mathworld.wolfram.com/ZipfDistribution.html
427*9356374aSAndroid Build Coastguard Worker //
428*9356374aSAndroid Build Coastguard Worker // Example:
429*9356374aSAndroid Build Coastguard Worker //
430*9356374aSAndroid Build Coastguard Worker // absl::BitGen bitgen;
431*9356374aSAndroid Build Coastguard Worker // ...
432*9356374aSAndroid Build Coastguard Worker // int term_rank = absl::Zipf<int>(bitgen);
433*9356374aSAndroid Build Coastguard Worker //
434*9356374aSAndroid Build Coastguard Worker template <typename IntType, typename URBG>
435*9356374aSAndroid Build Coastguard Worker IntType Zipf(URBG&& urbg, // NOLINT(runtime/references)
436*9356374aSAndroid Build Coastguard Worker IntType hi = (std::numeric_limits<IntType>::max)(), double q = 2.0,
437*9356374aSAndroid Build Coastguard Worker double v = 1.0) {
438*9356374aSAndroid Build Coastguard Worker static_assert(random_internal::IsIntegral<IntType>::value,
439*9356374aSAndroid Build Coastguard Worker "Template-argument 'IntType' must be an integral type, in "
440*9356374aSAndroid Build Coastguard Worker "absl::Zipf<IntType, URBG>(...)");
441*9356374aSAndroid Build Coastguard Worker
442*9356374aSAndroid Build Coastguard Worker using gen_t = absl::decay_t<URBG>;
443*9356374aSAndroid Build Coastguard Worker using distribution_t = typename absl::zipf_distribution<IntType>;
444*9356374aSAndroid Build Coastguard Worker
445*9356374aSAndroid Build Coastguard Worker return random_internal::DistributionCaller<gen_t>::template Call<
446*9356374aSAndroid Build Coastguard Worker distribution_t>(&urbg, hi, q, v);
447*9356374aSAndroid Build Coastguard Worker }
448*9356374aSAndroid Build Coastguard Worker
449*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
450*9356374aSAndroid Build Coastguard Worker } // namespace absl
451*9356374aSAndroid Build Coastguard Worker
452*9356374aSAndroid Build Coastguard Worker #endif // ABSL_RANDOM_DISTRIBUTIONS_H_
453