#include <deque>
#include <random>
#include <algorithm>
#include <cmath>
#include <iostream>
int countTo24(std::mt19937& gen, std::uniform_int_distribution<>& dist)
{
bool found[24] = {0};
int remaining = 24;
int attempts;
for (attempts = 0; remaining != 0; attempts++)
{
int random = dist(gen);
if (!found[random])
{
found[random] = true;
remaining--;
}
}
return attempts;
}
int main()
{
int randomState[16];
std::seed_seq seed(std::begin(randomState), std::end(randomState));
std::mt19937 gen(seed);
std::uniform_int_distribution<> dist(0, 23);
std::deque<int> counts;
for (int i = 0; i < 100000; i++)
{
counts.push_back(countTo24(gen, dist));
}
long long averageAcc = 0;
for (int count : counts) averageAcc += count;
double average = averageAcc / (double)counts.size();
long long varianceAcc = 0;
for (int count : counts)
{
int diff = count - average;
varianceAcc += diff * diff;
}
double variance = varianceAcc / (double)counts.size();
double stdDev = sqrt(variance);
std::cout << "avg: " << average << std::endl;
std::cout << "stddev: " << stdDev << std::endl;
}
I2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBjb3VudFRvMjQoc3RkOjptdDE5OTM3JiBnZW4sIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4mIGRpc3QpCnsKCWJvb2wgZm91bmRbMjRdID0gezB9OwoJaW50IHJlbWFpbmluZyA9IDI0OwoJaW50IGF0dGVtcHRzOwoJZm9yIChhdHRlbXB0cyA9IDA7IHJlbWFpbmluZyAhPSAwOyBhdHRlbXB0cysrKQoJewoJCWludCByYW5kb20gPSBkaXN0KGdlbik7CgkJaWYgKCFmb3VuZFtyYW5kb21dKQoJCXsKCQkJZm91bmRbcmFuZG9tXSA9IHRydWU7CgkJCXJlbWFpbmluZy0tOwoJCX0KCX0KCXJldHVybiBhdHRlbXB0czsKfQoKaW50IG1haW4oKQp7CglpbnQgcmFuZG9tU3RhdGVbMTZdOwoJc3RkOjpzZWVkX3NlcSBzZWVkKHN0ZDo6YmVnaW4ocmFuZG9tU3RhdGUpLCBzdGQ6OmVuZChyYW5kb21TdGF0ZSkpOwoJc3RkOjptdDE5OTM3IGdlbihzZWVkKTsKCXN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gZGlzdCgwLCAyMyk7CgkKCXN0ZDo6ZGVxdWU8aW50PiBjb3VudHM7Cglmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKQoJewoJCWNvdW50cy5wdXNoX2JhY2soY291bnRUbzI0KGdlbiwgZGlzdCkpOwoJfQoJCglsb25nIGxvbmcgYXZlcmFnZUFjYyA9IDA7Cglmb3IgKGludCBjb3VudCA6IGNvdW50cykgYXZlcmFnZUFjYyArPSBjb3VudDsKCWRvdWJsZSBhdmVyYWdlID0gYXZlcmFnZUFjYyAvIChkb3VibGUpY291bnRzLnNpemUoKTsKCQoJbG9uZyBsb25nIHZhcmlhbmNlQWNjID0gMDsKCWZvciAoaW50IGNvdW50IDogY291bnRzKQoJewoJCWludCBkaWZmID0gY291bnQgLSBhdmVyYWdlOwoJCXZhcmlhbmNlQWNjICs9IGRpZmYgKiBkaWZmOwoJfQoJZG91YmxlIHZhcmlhbmNlID0gdmFyaWFuY2VBY2MgLyAoZG91YmxlKWNvdW50cy5zaXplKCk7Cglkb3VibGUgc3RkRGV2ID0gc3FydCh2YXJpYW5jZSk7CgkKCXN0ZDo6Y291dCA8PCAiYXZnOiAiIDw8IGF2ZXJhZ2UgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJzdGRkZXY6ICIgPDwgc3RkRGV2IDw8IHN0ZDo6ZW5kbDsKfQ==