blob: 0e58b78af66e09bdc15e22bad3ed2abbc8522216 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COBALT_SRC_ALGORITHMS_RANDOM_DISTRIBUTIONS_H_
#define COBALT_SRC_ALGORITHMS_RANDOM_DISTRIBUTIONS_H_
#include <random>
#include "src/algorithms/random/random.h"
namespace cobalt {
// Abstract class that provides samples from a discrete distribution.
template <typename sample_type>
class DiscreteDistribution {
public:
virtual sample_type Sample() = 0;
virtual ~DiscreteDistribution() = default;
};
// Provides samples from the Bernoulli distribution with parameter |p|. Entropy is obtained from a
// uniform random bit generator |gen|.
class BernoulliDistribution : public DiscreteDistribution<bool> {
public:
BernoulliDistribution(BitGeneratorInterface<uint32_t>* gen, double p);
BernoulliDistribution() = default;
bool Sample() override;
private:
BitGeneratorInterface<uint32_t>* gen_;
std::bernoulli_distribution dist_;
};
// Provides samples from the binomial distribution with parameters |num_trials| and |p|. Entropy is
// obtained from a uniform random bit generator |gen|.
class BinomialDistribution : public DiscreteDistribution<uint64_t> {
public:
BinomialDistribution(BitGeneratorInterface<uint32_t>* gen, uint64_t num_trials, double p);
uint64_t Sample() override;
private:
BitGeneratorInterface<uint32_t>* gen_;
std::binomial_distribution<uint64_t> dist_;
};
// Provides samples from the uniform distribution over the integers from |min| to |max|, inclusive.
// Entropy is obtained from a uniform random bit generator |gen|.
class DiscreteUniformDistribution : public DiscreteDistribution<uint32_t> {
public:
DiscreteUniformDistribution(BitGeneratorInterface<uint32_t>* gen, uint32_t min, uint32_t max);
DiscreteUniformDistribution() = default;
uint32_t Sample() override;
private:
BitGeneratorInterface<uint32_t>* gen_;
std::uniform_int_distribution<uint32_t> dist_;
};
// Provides samples from the geometric distribution with parameter |p|. Entropy is
// obtained from a uniform random bit generator |gen|.
class GeometricDistribution : public DiscreteDistribution<uint64_t> {
public:
GeometricDistribution(BitGeneratorInterface<uint32_t>* gen, double p);
uint64_t Sample() override;
private:
BitGeneratorInterface<uint32_t>* gen_;
std::geometric_distribution<uint64_t> dist_;
};
// Provides samples from the poisson distribution with mean |mean|.
// Entropy is obtained from a uniform random bit generator |gen|.
class PoissonDistribution : public DiscreteDistribution<int> {
public:
PoissonDistribution(BitGeneratorInterface<uint32_t>* gen, int mean);
int Sample() override;
private:
BitGeneratorInterface<uint32_t>* gen_;
std::poisson_distribution<int> dist_;
};
} // namespace cobalt
#endif // COBALT_SRC_ALGORITHMS_RANDOM_DISTRIBUTIONS_H_