#!/usr/local/bin/perl -w
###########################################
# coin-toss - counting tails while
#   flipping a coin 
# Mike Schilli, 2015 (m@perlmeister.com)
###########################################
use strict;
use Math::BigFloat;

my @sides  = qw( H T );
my $rounds = 1000;
my $tails  = 0;

for ( 1 .. $rounds ) {
  my $side = $sides[ rand scalar @sides ];

  if( $side eq "T" ) {
    $tails++;
  }
}

printf "Rounds:  $rounds\n";
printf "Tails:   $tails\n";
printf "p-value: %f\n", 
  p_value( $tails, $rounds/2, $rounds );

###########################################
sub p_value {
###########################################
  my( $tails, $expect, $rounds ) = @_;

  my @vals = ( $tails < $expect ? 
               ( 1 .. $tails ) :
               ( $tails .. $rounds ) );

  my $sum = Math::BigFloat->new( 0 );

  for my $val ( @vals ) {
    my $nok = 
      Math::BigFloat->new( $rounds ); 
    $nok->bnok( $val );
    $sum->badd( $nok );
  }

  my $total = Math::BigFloat->new( 2 );
  $total->bpow( $rounds );

  return 2 * 
    $sum->bdiv( $total )->numify();
}
