/** * Program to produce sequence of random numbers and compare two ways of * mapping them to a small range. */ #include #include /* has rand(), srand(), RAND_MAX */ void print_stats(int num_bins, int* bins) { int min = bins[0]; int max = bins[0]; for (int i = 0; i < num_bins; ++i) { printf("(%d) %d\n", i, bins[i]); if (bins[i] < min) min = bins[i]; if (bins[i] > max) max = bins[i]; } printf("min = %d, max = %d, difference %d\n", min, max, max-min); } 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] += 1; qbins[rounded_quotient] += 1; } printf("counts using remainder method:\n"); print_stats(num_bins, rbins); printf("counts using quotient method:\n"); print_stats(num_bins, qbins); return EXIT_SUCCESS; }