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

62 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "rng.h"
#include "rngutil.h"
int cmp(const void *a, const void *b) {
float af = *(float *) a;
float bf = *(float *) b;
if (bf - af > 0) {
return -1;
} else if (bf - af < 0) {
return 1;
} else {
return 0;
}
}
int main() {
rng *base = get_rng(8);
const size_t n_ns = 4;
size_t ns[] = {100, 1000, 10000, 100000};
float **samples = calloc(n_ns * 2, sizeof(float *));
size_t i, j;
for (i = 0; i < n_ns; i++) {
samples[i * 2] = calloc(ns[i], sizeof(float));
samples[i * 2 + 1] = calloc(ns[i], sizeof(float));
for (j = 0; j < ns[i]; j++) {
samples[i * 2][j] = rng_uniform(base, -3, 4);
samples[i * 2 + 1][j] = rng_gaussian(base, 0.5, 1.5);
}
qsort(samples[i * 2], ns[i], sizeof(float), cmp);
qsort(samples[i * 2 + 1], ns[i], sizeof(float), cmp);
}
Interval *interval1 = new_interval(100);
Interval *interval2 = new_interval(100);
for (i = 0; i < n_ns; i++) {
intervalizing(interval1, ns[i], samples[i * 2]);
intervalizing(interval2, ns[i], samples[i * 2 + 1]);
printf("=== Uniform Distribution #%lu\n", i);
print_histogram(interval1, ns[i], samples[i * 2]);
printf("=== Gaussian Distribution #%lu\n", i);
print_histogram(interval2, ns[i], samples[i * 2 + 1]);
}
for (j = 0; j < n_ns * 2; j++) {
free(samples[j]);
}
free(samples);
free_interval(interval1);
free_interval(interval2);
free_rng(base);
base = NULL;
return 0;
}