add for hw4
This commit is contained in:
90
hws/hw4/rngutil.c
Normal file
90
hws/hw4/rngutil.c
Normal file
@@ -0,0 +1,90 @@
|
||||
#include "rngutil.h"
|
||||
|
||||
Interval *new_interval(size_t n_int) {
|
||||
Interval *x = malloc(sizeof(Interval));
|
||||
x->n_interval = n_int;
|
||||
x->indexed = calloc(n_int, sizeof(size_t));
|
||||
return x;
|
||||
}
|
||||
|
||||
void free_interval(Interval *x) {
|
||||
free(x->indexed);
|
||||
free(x);
|
||||
}
|
||||
|
||||
void intervalizing(Interval *interval, size_t n,
|
||||
float *samples /* samples must be sorted */) {
|
||||
|
||||
float lo = samples[0];
|
||||
float hi = samples[n - 1];
|
||||
|
||||
float dx = (hi - lo) / interval->n_interval;
|
||||
|
||||
float curr = lo + dx;
|
||||
|
||||
size_t i = 0;
|
||||
size_t ind = 0;
|
||||
while (i < n) {
|
||||
if (samples[i] < curr) {
|
||||
i++;
|
||||
} else {
|
||||
if (ind == interval->n_interval - 1) {
|
||||
interval->indexed[ind] = n;
|
||||
} else {
|
||||
interval->indexed[ind] = i;
|
||||
}
|
||||
|
||||
ind++;
|
||||
curr = lo + (ind + 1) * dx;
|
||||
}
|
||||
}
|
||||
if (interval->indexed[interval->n_interval - 1] != n) {
|
||||
interval->indexed[interval->n_interval - 1] = n;
|
||||
}
|
||||
}
|
||||
|
||||
void print_histogram(Interval *interval, size_t n, float *samples) {
|
||||
size_t n_interval = interval->n_interval;
|
||||
size_t prev_cum_count = 0;
|
||||
|
||||
const int MAX_STARS = 80;
|
||||
|
||||
double avg_count = (double) n / (double) n_interval;
|
||||
double scale_max = avg_count * 4;
|
||||
printf("------------------------------------------------------\n");
|
||||
printf("# Histogram (n_samples: %zu, avg_bin: %.2f) #\n",
|
||||
n, avg_count);
|
||||
printf("# (scale ref.: %.2f count = %d stars) #\n",
|
||||
scale_max, MAX_STARS);
|
||||
printf("# min: %6.2f, max: %6.2f\n",
|
||||
samples[0], samples[n - 1]);
|
||||
size_t i, j;
|
||||
for (i = 0; i < n_interval; i++) {
|
||||
size_t current_cumulative_count = interval->indexed[i];
|
||||
size_t individual_count = current_cumulative_count - prev_cum_count;
|
||||
|
||||
if (current_cumulative_count < prev_cum_count) {
|
||||
printf("!\n");
|
||||
individual_count = 0;
|
||||
}
|
||||
|
||||
int num_stars = (int) (((double) individual_count / scale_max) * MAX_STARS);
|
||||
|
||||
if (num_stars > MAX_STARS) {
|
||||
num_stars = MAX_STARS;
|
||||
}
|
||||
|
||||
printf("Bin %3zu: [%8zu](%5.2f%%) | ", i, individual_count, (double) individual_count / (double) n * 100.0);
|
||||
for (j = 0; j < num_stars; j++) {
|
||||
printf("*");
|
||||
}
|
||||
|
||||
if (num_stars == MAX_STARS && (double) individual_count > scale_max) {
|
||||
printf("+");
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
prev_cum_count = current_cumulative_count;
|
||||
}
|
||||
printf("------------------------------------------------------\n");
|
||||
}
|
||||
Reference in New Issue
Block a user