# Algorithms_in_C++: probability/geometric_dist.cpp File Reference

Loading...
Searching...
No Matches
geometric_dist.cpp File Reference

Geometric Distribution More...

`#include <cassert>`
`#include <cmath>`
`#include <cstdint>`
`#include <ctime>`
`#include <iostream>`
`#include <limits>`
`#include <random>`
`#include <vector>`
Include dependency graph for geometric_dist.cpp:

## Classes

class | probability::geometric_dist::geometric_distribution
| A class to model the geometric distribution. More...

## Namespaces

namespace | probability
| Probability algorithms.
namespace | geometric_dist
| Functions for the Geometric Distribution algorithm implementation.

## Functions

float | probability::geometric_dist::generate_uniform ()
| Returns a random number between [0,1]. More...
void | sample_test (const probability::geometric_dist::geometric_distribution &dist)
| Tests the sampling method of the geometric distribution. More...
static void | test ()
| Self-test implementations. More...
int | main ()
| Main function. More...

## Detailed Description

Geometric Distribution

The geometric distribution models the experiment of doing Bernoulli trials until a sucess was observed. There are two formulations of the geometric distribution: 1) The probability distribution of the number X of Bernoulli trials needed to get one success, supported on the set { 1, 2, 3, ... } 2) The probability distribution of the number Y = X − 1 of failures before the first success, supported on the set { 0, 1, 2, 3, ... } Here, the first one is implemented.

Common variables used: p - The success probability k - The number of tries

Author
  Domenic Zingsheim

## Function Documentation

## generate_uniform()

float probability::geometric_dist::generate_uniform | ( |  | ) |

Returns a random number between [0,1].

Returns
  A uniformly distributed random number between 0 (included) and 1 (included)

{
return static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
}
std::rand
T rand(T... args)
Here is the call graph for this function:

## main()

int main | ( | void |  | ) |

Main function.

Returns
  0 on exit

{
srand(time(nullptr));
test(); // run self-test implementations
return 0;
}
test
static void test()
Self-test implementations.
Definition: geometric_dist.cpp:197
std::srand
T srand(T... args)
std::time
T time(T... args)
Here is the call graph for this function:

## sample_test()

void sample_test | ( | const probability::geometric_dist::geometric_distribution & | dist | ) |

Tests the sampling method of the geometric distribution.

Draws 1000000 random samples and estimates mean and variance These should be close to the expected value and variance of the given distribution to pass.

Parameters

  dist | The distribution to test

{
uint32_t n_tries = 1000000;
std::vector<float> tries;
tries.resize(n_tries);
float mean = 0.0f;
for (uint32_t i = 0; i < n_tries; ++i) {
tries[i] = static_cast<float>(dist.draw_sample());
mean += tries[i];
}
mean /= static_cast<float>(n_tries);
float var = 0.0f;
for (uint32_t i = 0; i < n_tries; ++i) {
var += (tries[i] - mean) * (tries[i] - mean);
}
// Unbiased estimate of variance
var /= static_cast<float>(n_tries - 1);
std::cout << "This value should be near " << dist.expected_value() << ": "
<< mean << std::endl;
std::cout << "This value should be near " << dist.variance() << ": " << var
<< std::endl;
}
std::cout
probability::geometric_dist::geometric_distribution::expected_value
float expected_value() const
The expected value of a geometrically distributed random variable X.
Definition: geometric_dist.cpp:71
probability::geometric_dist::geometric_distribution::draw_sample
uint32_t draw_sample() const
Generates a (discrete) sample according to the geometrical distribution.
Definition: geometric_dist.cpp:125
probability::geometric_dist::geometric_distribution::variance
float variance() const
The variance of a geometrically distributed random variable X.
Definition: geometric_dist.cpp:77
std::endl
T endl(T... args)
std::vector::resize
T resize(T... args)
std::vector
Here is the call graph for this function:

## test()

static void test | ( |  | ) |

static

Self-test implementations.

Returns
  void

{
probability::geometric_dist::geometric_distribution dist(0.3);
const float threshold = 1e-3f;
std::cout << "Starting tests for p = 0.3..." << std::endl;
assert(std::abs(dist.expected_value() - 3.33333333f) < threshold);
assert(std::abs(dist.variance() - 7.77777777f) < threshold);
assert(std::abs(dist.standard_deviation() - 2.788866755) < threshold);
assert(std::abs(dist.probability_density(5) - 0.07203) < threshold);
assert(std::abs(dist.cumulative_distribution(6) - 0.882351) < threshold);
assert(std::abs(dist.inverse_cumulative_distribution(
dist.cumulative_distribution(8)) -
8) < threshold);
assert(std::abs(dist.range_tries() - 1.0f) < threshold);
assert(std::abs(dist.range_tries(3) - 0.49f) < threshold);
assert(std::abs(dist.range_tries(5, 11) - 0.2203267f) < threshold);
std::cout << "All tests passed" << std::endl;
sample_test(dist);
dist = probability::geometric_dist::geometric_distribution(0.5f);
std::cout << "Starting tests for p = 0.5..." << std::endl;
assert(std::abs(dist.expected_value() - 2.0f) < threshold);
assert(std::abs(dist.variance() - 2.0f) < threshold);
assert(std::abs(dist.standard_deviation() - 1.4142135f) < threshold);
assert(std::abs(dist.probability_density(5) - 0.03125) < threshold);
assert(std::abs(dist.cumulative_distribution(6) - 0.984375) < threshold);
assert(std::abs(dist.inverse_cumulative_distribution(
dist.cumulative_distribution(8)) -
8) < threshold);
assert(std::abs(dist.range_tries() - 1.0f) < threshold);
assert(std::abs(dist.range_tries(3) - 0.25f) < threshold);
assert(std::abs(dist.range_tries(5, 11) - 0.062011f) < threshold);
std::cout << "All tests passed" << std::endl;
sample_test(dist);
dist = probability::geometric_dist::geometric_distribution(0.8f);
std::cout << "Starting tests for p = 0.8..." << std::endl;
assert(std::abs(dist.expected_value() - 1.25f) < threshold);
assert(std::abs(dist.variance() - 0.3125f) < threshold);
assert(std::abs(dist.standard_deviation() - 0.559016f) < threshold);
assert(std::abs(dist.probability_density(5) - 0.00128) < threshold);
assert(std::abs(dist.cumulative_distribution(6) - 0.999936) < threshold);
assert(std::abs(dist.inverse_cumulative_distribution(
dist.cumulative_distribution(8)) -
8) < threshold);
assert(std::abs(dist.range_tries() - 1.0f) < threshold);
assert(std::abs(dist.range_tries(3) - 0.04f) < threshold);
assert(std::abs(dist.range_tries(5, 11) - 0.00159997f) < threshold);
std::cout << "All tests have successfully passed!" << std::endl;
sample_test(dist);
}
probability::geometric_dist::geometric_distribution
A class to model the geometric distribution.
Definition: geometric_dist.cpp:55
sample_test
void sample_test(const probability::geometric_dist::geometric_distribution &dist)
Tests the sampling method of the geometric distribution.
Definition: geometric_dist.cpp:165
Here is the call graph for this function: