#include <iostream>
#include <vector>
#include <ranges>
#include <random>
#include <chrono>
#include <algorithm>
#include <iomanip>
#include <format>
#include <locale>
int main() {
using namespace std;
using clock = chrono::high_resolution_clock;
locale::global(locale(""));
// Testparameter
vector<size_t> total_sizes = { 100'000, 1'000'000, 10'000'000, 100'000'000 };
vector<size_t> sample_sizes = { 1'000, 5'000, 10'000, 50'000, 100'000, 1'000'000 };
random_device rd;
mt19937 rnd_generator(rd());
// Tabellenkopf
cout << left << setw(15) << "N / Sample";
for (size_t s : sample_sizes)
cout << right << setw(20) << format("{:L}", s);
cout << "\n" << string(15 + 20 * sample_sizes.size(), '-') << "\n";
// Für jede Datenmenge N:
for (size_t N : total_sizes) {
cout << right << setw(15) << format("{:L}", N);
// 1. Erzeuge Werte und Pointer
vector<int> values;
values.reserve(N);
for (int i : views::iota(0, static_cast<int>(N)))
values.push_back(i);
vector<int*> ptrs;
ptrs.reserve(N);
for (auto& v : values)
ptrs.push_back(&v);
// 2. Messen für verschiedene Samplegrößen
for (size_t sample_count : sample_sizes) {
if (sample_count > N) {
cout << right << setw(20) << "-";
continue;
}
vector<int*> random_selection;
random_selection.reserve(sample_count);
auto start = clock::now();
ranges::sample(ptrs, back_inserter(random_selection), sample_count, rnd_generator);
auto end = clock::now();
chrono::duration<double> elapsed = end - start;
cout << right << setw(20) << format("{:.6f}", elapsed.count());
}
cout << "\n";
}
return 0;
}