Files
2025-02-Numerical/hws/hw4/rngutil.c
2025-11-09 17:36:29 +09:00

90 lines
2.5 KiB
C

#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");
}