//------------------------------------------------------------------- // bindist.cpp // // This program displays a probability distribution and graph // for the Binomial Distribution with parameters n and p . // // to compile: $ g++ bindist.cpp -o bindist // to execute: $ ./bindist // // programmer: ALLAN CRUSE // written on: 21 FEB 2011 //------------------------------------------------------------------- #include // for printf() #include // for sqrt() #define N_MAX 50 double p = 0.50; double mu, sigma; double power_of_p[ N_MAX+1 ]; double power_of_q[ N_MAX+1 ]; unsigned long long pascal[ N_MAX+1 ][ N_MAX+1 ]; void initialize_powers( void ) { power_of_p[ 0 ] = 1.0; power_of_q[ 0 ] = 1.0; for (int k = 1; k <= N_MAX; k++) { power_of_p[ k ] = power_of_p[ k-1 ] * p; power_of_q[ k ] = power_of_q[ k-1 ] * (1.0 - p); } } void initialize_pascal( void ) { for (int n = 0; n <= N_MAX; n++) { pascal[ n ][ 0 ] = 1LL; for (int k = 1; k <= n; k++) pascal[ n ][ k ] = pascal[ n-1 ][ k-1 ] + pascal[ n-1 ][ k ]; } } unsigned long long bincoeff( int n, int k ) { if (( n < 0 )||( k < 0 )||( n < k )) return 0LL; return pascal[ n ][ k ]; } int main( int argc, char **argv ) { // initialize global variables int n = N_MAX; mu = n * p; sigma = sqrt( mu * (1.0 - p) ); initialize_pascal(); initialize_powers(); // exhibit the binomial distribution function printf( "\n" ); printf( " Binomial probability distribution" ); printf( " for n=%d, p=%1.5f \n\n", n, p ); for (int k = 0; k <= n; k++) { double prob = bincoeff( n, k ) * 1.0; prob *= power_of_p[ k ]; prob *= power_of_q[ n-k ]; printf( " k=%-3d ", k ); printf( "prob=%1.5f ", prob ); int m = (int)(300.0 * prob); for (int j = 0; j < m; j++) printf( "*" ); printf( "\n" ); } // report this distribution's statistical parameters printf( "\n n=%d mu=%1.5f sigma=%1.5f \n\n", n, mu, sigma ); }