diff options
| -rwxr-xr-x | ex_0702.py | 22 | ||||
| -rw-r--r-- | exp_0702.cpp | 61 |
2 files changed, 57 insertions, 26 deletions
diff --git a/ex_0702.py b/ex_0702.py new file mode 100755 index 0000000..0a314d7 --- /dev/null +++ b/ex_0702.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +import argparse +import subprocess + +import matplotlib.pyplot as plt + + +def function_pdf(proc: str): + p = subprocess.Popen([proc], stdin=subprocess.PIPE, stdout=subprocess.PIPE) + output, _ = p.communicate(b"1024 1024\n32768 1024\n32768 32768\n") + p.stdin.close() + for index in range(0, len(lines := output.splitlines()), 2): + plt.hist(list(map(int, lines[index].split())), bins=100) + plt.title(f"stddev: {lines[index + 1].decode()}") + plt.show() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('proc') + matches = parser.parse_args() + function_pdf(matches.proc) diff --git a/exp_0702.cpp b/exp_0702.cpp index b848b67..eca70ad 100644 --- a/exp_0702.cpp +++ b/exp_0702.cpp @@ -2,13 +2,14 @@ #include <cassert> #include <cmath> #include <cstdio> +#include <iostream> #include <numeric> +#include <string> #include <vector> constexpr size_t length = 1048576; -constexpr size_t sample_length = 1024; -constexpr long double slice_size = 1.0 / sample_length; -std::vector<unsigned long long> population_vector, sample_vector; +std::vector<unsigned long long> population_vector, sample_vector, + original_vector; std::vector<std::vector<unsigned long long>> result_storage; long double sample_cdf(long double x) { @@ -30,7 +31,7 @@ inline long double safe_ceil(long double value) { return c == 0 ? 1 : c; } -long double calc_stddev() { +long double calc_stddev(const long sample_length) { std::vector<size_t> elements; std::vector<long double> tmp_vector; for (auto &element : result_storage) { @@ -40,9 +41,9 @@ long double calc_stddev() { // auto sum = std::accumulate(elements.begin(), // elements.end(),decltype(elements)::value_type(0)); size_t sum = length; // printf("\nsum: %ld\n", sum); - // auto mu = sum / (long double)elements.size(); - long double mu = sample_length; - // printf("mu: %Lf\n", mu); + auto mu = length / (long double)elements.size(); + // long double mu = sample_length; + // printf("mu: %Lf\n", mu); std::transform(elements.begin(), elements.end(), tmp_vector.begin(), [&mu](size_t element) { return std::pow(element - mu, 2); }); @@ -52,30 +53,15 @@ long double calc_stddev() { elements.size()); } -int main() { - assert((length & 1) == 0); - assert(length > 1024); - - FILE *file = fopen("normal_distribution.txt", "r"); - assert(file); - for (long long i; fscanf(file, "%lld ", &i) != EOF; - population_vector.push_back(i)) - ; - fclose(file); - - assert(population_vector.size() == length); - - std::vector<unsigned long long> original_vector(population_vector); - +void mian(const long sample_length, const long split_size) { sample_vector = std::vector<unsigned long long>( - population_vector.begin(), population_vector.begin() + sample_length); - + original_vector.begin(), original_vector.begin() + sample_length); result_storage.resize(sample_length, std::vector<unsigned long long>()); - std::sort(population_vector.begin(), population_vector.end()); sample_vector.push_back(population_vector[0]); sample_vector.push_back(*(population_vector.cend() - 1)); std::sort(sample_vector.begin(), sample_vector.end()); + const auto slice_size = 1.0 / (long double)split_size; for (auto &element : original_vector) { result_storage[(int)safe_ceil(sample_cdf(element) / slice_size) - 1] @@ -88,5 +74,28 @@ int main() { for (const auto &element : result_storage) { printf("%ld ", element.size()); } - printf("%Lf\n", calc_stddev()); + printf("\n%Lf\n", calc_stddev(sample_length)); + result_storage.clear(); +} + +int main(int argc, char const *argv[]) { + assert((length & 1) == 0); + assert(length > 1024); + + FILE *file = fopen("normal_distribution.txt", "r"); + assert(file); + for (long long i; fscanf(file, "%lld ", &i) != EOF; + population_vector.push_back(i)) + ; + fclose(file); + + assert(population_vector.size() == length); + + original_vector = population_vector; + + std::sort(population_vector.begin(), population_vector.end()); + auto sample_length = 0, split_size = 0; + while (std::cin >> sample_length >> split_size) { + mian(sample_length, split_size); + } }
\ No newline at end of file |
