//
// TestPercent.m
//
// This program tests the Random classes' abilities to generate
// random percentages.
//


#import "Random.h"
#import "StandardEngine.h"
#import "ElkinsEngine.h"
#import "R250Engine.h"
#import <math.h>
#import <stdio.h>
#import <stdlib.h>


#define DEFAULT_N	10000
#define DEFAULT_M	20


#define MAX_BAR		40


//
// test_percent()
//
// This function takes the id of a prepared Random
// instance and prints out the percent_test
// histogram using it.
//

int test_percent(id myRand, int m, int n)
{
    int		max;				// Size of largest bin.
    int		total;
    int		i;				// Generic loop variable.
    int		j;				// Generic loop variable.
    double	x;				// The random number.
    int		slot;				// The sorted position of a number.
    int		barsize;			// The length of a result bar.
    int		*slots;				// The bin array (dynamically allocated).
    
    //
    // Allocate and initialize slot array:
    //
    
//    printf("Initializing slot array...\n");
    
    slots = (int *)malloc(m * sizeof(int));
    for(i = 0; i < m; i++)
        slots[i] = 0;
    
    //
    // Make n random numbers:
    //
    
//    printf("Making %d random numbers...\n", n);
    
    max = 0;
    for(i = 0; i < n; i++) {
        x = [myRand percent];
	
	slot = (int)floor(x * m);
	if((slot >= 0) && (slot < m)) {		// If it is in range,
	    if((++slots[slot]) > max) {		//   count it.
		max = slots[slot];
	    }
	}
	else {
	    printf(">> Value %f out of range!\n", x);
	}
    }
    
    //
    // Print the results:
    //
    
//    printf("Printing the results...\n");
    
    total = 0;
    for(i = 0; i < m; i++) {
        printf("%1.6f - %1.6f: %6d:", i * (1.0 / m), (i + 1) * (1.0 / m), slots[i]);
	
	total += slots[i];
	barsize = (int)((double)slots[i] / ((double)max / (double)MAX_BAR));
	for(j = 0; j < barsize; j++)
	    printf("*");
	printf("\n");
    }
    
    printf("Max =   %6d\n", max);
    printf("Total = %6d\n", total);
    
    //
    // Clean up:
    //
    
    free(slots);
    
    //
    // Return to caller:
    //
    
    return 0;
}


//
// main()
//

int main(int argc, char *argv[])
{
    id		myRand;				// Random number generator.
    int		n;				// Quantity of numbers to generate.
    int		m;				// Number of slots in which to sort them.
    
    switch(argc) {
        case 2:
	    sscanf(argv[1], "%d", &n);;
	    m = DEFAULT_M;
	    break;
	case 3:
	    sscanf(argv[1], "%d", &n);;
	    sscanf(argv[2], "%d", &m);;
	    break;
	default:
	    n = DEFAULT_N;
	    m = DEFAULT_M;
	    break;
    }
    
    printf("TestPercent: Testing StandardEngine class:\n");
    myRand = [[Random alloc] initEngineClass:[StandardEngine class]];
    test_percent(myRand, m, n);
    printf("\n\n");
    [myRand free];
    
    printf("TestPercent: Testing ElkinsEngine class:\n");
    myRand = [[Random alloc] initEngineClass:[ElkinsEngine class]];
    test_percent(myRand, m, n);
    printf("\n\n");
    [myRand free];
    
    printf("TestPercent: Testing R250Engine class:\n");
    myRand = [[Random alloc] initEngineClass:[R250Engine class]];
    test_percent(myRand, m, n);
    printf("\n\n");
    [myRand free];
    
    return 0;
}


//
// End of file.
//