Skip to content

Instantly share code, notes, and snippets.

@orlp
Created January 6, 2015 15:19
Show Gist options
  • Save orlp/d422f063dafc5e7c7b1c to your computer and use it in GitHub Desktop.
Save orlp/d422f063dafc5e7c7b1c to your computer and use it in GitHub Desktop.
#include <iostream>
#include <iomanip>
// Expected value of an n-sided die.
double E_die(int n) {
return (n + 1) / 2.;
}
// Variance of an n-sided die.
double V_die(int n) {
double u = E_die(n);
double p = 1. / n;
double var = 0.;
for (int i = 1; i <= n; ++i) {
double t = (i - u);
var += t*t*p;
}
return var;
}
int main(int argc, char** argv) {
// The expectation of a random sum of N random variables:
//
// | N |
// E | sum X_i | = E[N]E[X]
// | i=1 |
//
double E_T = E_die(4);
double E_C = E_T * E_die(6);
double E_O = E_C * E_die(8);
double E_D = E_O * E_die(12);
double E_I = E_D * E_die(20);
// The variance of a random sum of N random variables:
//
// | N |
// Var | sum X_i | = E[N] * Var[X] + E[X]^2 * Var[N]
// | i=1 |
//
// So the variance of the sum of 1-4 6-sided die rolls is:
// E_die(4) * V_die(6) + sq(E_die(6)) * V_die(4)
double V_T = V_die(4);
double V_C = V_T * sq(E_die(6)) + E_T * V_die(6);
double V_O = V_C * sq(E_die(8)) + E_C * V_die(8);
double V_D = V_O * sq(E_die(12)) + E_O * V_die(12);
double V_I = V_D * sq(E_die(20)) + E_D * V_die(20);
std::cout << std::fixed << std::setprecision(4) << V_I << "\n";
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment