
             /* bin_distribution.c                              */
             /* find # of random numbers in equally spaced grid */
             /* bin the grid counter                            */

/* Syntax: */

/* random_demo_2_series 1 20000 | bin_distribution > data_file */

/* random_demo_2_series 2 20000 | bin_distribution > data_file */

                                                       /* Michel Vallieres */
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100000
#define N_MAX_GRID 25

int main ( int argc, char *argv[] )
{
  int    N;
  double x[NMAX], y[NMAX];
  int    counter[N_MAX_GRID][N_MAX_GRID];
  int    ix_scan, iy_scan, ic, max_bin, ibin, *bin;
  double dx, dy;

                                                 /* read in the random points coordinates */
  N = 0;
  while ( scanf( "%lf %lf", &x[N], &y[N] ) != EOF )
      N++;
  fprintf( stderr, "\n  Number of random numbers %d \n", N );
                                                 /* set counter to zero */
  for ( ix_scan=0 ; ix_scan<N_MAX_GRID ; ix_scan++ )
    {
      for ( iy_scan=0 ; iy_scan<N_MAX_GRID ; iy_scan++ )
	{
          counter[ix_scan][iy_scan] = 0;
	}
    }
                                                 /* grid of squares dx & dy */
  dx = 1.0/N_MAX_GRID;
  dy = 1.0/N_MAX_GRID;
                                                 /* scan grid */
  for ( ix_scan=0 ; ix_scan<N_MAX_GRID ; ix_scan++ )
    {
      for ( iy_scan=0 ; iy_scan<N_MAX_GRID ; iy_scan++ )
	{
	                                         /* scan over random numbers */
          for ( ic=0 ; ic<N ; ic++ )
	    {
              if ( ( ix_scan*dx <= x[ic] && x[ic] < (ix_scan+1)*dx )
                && (  iy_scan*dy <= y[ic] && y[ic] < (iy_scan+1)*dy ) )
                   counter[ix_scan][iy_scan]++;
	    }
	}
    }
                                                 /* find max of counter value */
                                                 /* & print counter */
  max_bin = 0;
  fprintf( stderr, "\n distribution \n" );
  for ( ix_scan=0 ; ix_scan<N_MAX_GRID ; ix_scan++ )
    {
      printf( "\n" );
      for ( iy_scan=0 ; iy_scan<N_MAX_GRID ; iy_scan++ )
	{
          if ( counter[ix_scan][iy_scan] > max_bin )
            max_bin++;
          fprintf( stderr, " %2d", counter[ix_scan][iy_scan] );
	}
    }
  fprintf( stderr,  "\n" );
                                                 /* bin the counter */
  bin = (int *)malloc( (max_bin+1)*sizeof(int) );
  for ( ix_scan=0 ; ix_scan<N_MAX_GRID ; ix_scan++ )
    {
      for ( iy_scan=0 ; iy_scan<N_MAX_GRID ; iy_scan++ )
	{
          bin[ counter[ix_scan][iy_scan] ]++;
        }
    }
                                                 /* output the bin */
  fprintf( stderr, "\n binning \n" );
  for ( ibin=0 ; ibin<max_bin ; ibin++ )
     if ( bin[ibin] != 0 )
        printf( " %d %d \n", ibin, bin[ibin] );

}









