/**
 * Program to produce sequence of random numbers and compare two ways of
 * mapping them to a small range.
 */
#include <stdio.h>
#include <stdlib.h> /* has rand(), srand(), RAND_MAX */

int main(void) {

	int seed;
	int num_samples;
	int num_bins;

	printf("seed?\n");
	if (scanf("%d", &seed) != 1) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}
	if (seed <= 0) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}
	printf("how many samples?\n");
	if (scanf("%d", &num_samples) != 1) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}
	if (num_samples <= 0) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}
	printf("how many bins?\n");
	if (scanf("%d", &num_bins) != 1) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}
	if (num_bins <= 0) {
		printf("invalid input\n");
		return EXIT_FAILURE;
	}

	srand(seed);

	int rbins[num_bins];
	int qbins[num_bins];
	for (int i = 0; i < num_bins; ++i) {
		rbins[i] = 0;
		qbins[i] = 0;
	}

	for (int i = 0; i < num_samples; ++i) {
		int n = rand();
		int remainder = n % num_bins;
		int rounded_quotient = (int) ((((double) num_bins) * n)/(RAND_MAX+1.0));
		rbins[remainder]++;
		qbins[rounded_quotient]++;
	}

	printf("counts using remainder method:\n");
	for (int i = 0; i < num_bins; ++i) {
		printf("(%d) %d (%.2f of total) \n", i, rbins[i], (double) rbins[i]/num_samples);
	}
	printf("counts using quotient method:\n");
	for (int i = 0; i < num_bins; ++i) {
		printf("(%d) %d (%.2f of total) \n", i, qbins[i], (double) qbins[i]/num_samples);
	}

	return EXIT_SUCCESS;
}