#include <iostream>
#include <random>
#include <set>
#include <map>
int main() {
// Actual album sizes from simonstalenhag-se-metadata
const char* names[] = {"svema","em","labyrinth","es","tftf","tftl","paleo","other"};
int albumSizes[] = {40, 37, 32, 48, 54, 46, 30, 34};
int numAlbums = 8;
int totalImages = 0;
for (int i = 0; i < numAlbums; i++) totalImages += albumSizes[i];
std::set<std::pair<int,int>> seen;
std::map<std::pair<int,int>, int> freq;
// ~1495 days from 2022-02-03 to 2026-03-09
int days = 1495;
for (int day = 0; day < days; day++) {
// Call 1: pick album (seed = day)
std::mt19937 eng1(day);
std::uniform_int_distribution<int> d1(0, numAlbums - 1);
int album = d1(eng1);
// Call 2: pick image — SAME seed!
std::mt19937 eng2(day);
std::uniform_int_distribution<int> d2(0, albumSizes[album] - 1);
int image = d2(eng2);
freq[{album, image}]++;
seen.insert({album, image});
}
std::cout << "Days: " << days << "\n";
std::cout << "Total images: " << totalImages << "\n";
std::cout << "Unique shown: " << seen.size() << "\n\n";
int minF = 1e9, maxF = 0;
for (auto it = freq.begin(); it != freq.end(); ++it) {
if (it->second < minF) minF = it->second;
if (it->second > maxF) maxF = it->second;
}
std::cout << "Min freq: " << minF << ", Max freq: " << maxF << "\n\n";
// Per-album breakdown
for (int a = 0; a < numAlbums; a++) {
int count = 0;
for (auto it = seen.begin(); it != seen.end(); ++it)
if (it->first == a) count++;
std::cout << names[a] << ": " << count << "/" << albumSizes[a] << " shown\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPG1hcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKaW50IG1haW4oKSB7CiAgICAvLyBBY3R1YWwgYWxidW0gc2l6ZXMgZnJvbSBzaW1vbnN0YWxlbmhhZy1zZS1tZXRhZGF0YQogICAgY29uc3QgY2hhciogbmFtZXNbXSA9IHsic3ZlbWEiLCJlbSIsImxhYnlyaW50aCIsImVzIiwidGZ0ZiIsInRmdGwiLCJwYWxlbyIsIm90aGVyIn07CiAgICBpbnQgYWxidW1TaXplc1tdID0gezQwLCAzNywgMzIsIDQ4LCA1NCwgNDYsIDMwLCAzNH07CiAgICBpbnQgbnVtQWxidW1zID0gODsKCiAgICBpbnQgdG90YWxJbWFnZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BbGJ1bXM7IGkrKykgdG90YWxJbWFnZXMgKz0gYWxidW1TaXplc1tpXTsKCiAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8aW50LGludD4+IHNlZW47CiAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8aW50LGludD4sIGludD4gZnJlcTsKCiAgICAvLyB+MTQ5NSBkYXlzIGZyb20gMjAyMi0wMi0wMyB0byAyMDI2LTAzLTA5CiAgICBpbnQgZGF5cyA9IDE0OTU7CgogICAgZm9yIChpbnQgZGF5ID0gMDsgZGF5IDwgZGF5czsgZGF5KyspIHsKICAgICAgICAvLyBDYWxsIDE6IHBpY2sgYWxidW0gKHNlZWQgPSBkYXkpCiAgICAgICAgc3RkOjptdDE5OTM3IGVuZzEoZGF5KTsKICAgICAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGQxKDAsIG51bUFsYnVtcyAtIDEpOwogICAgICAgIGludCBhbGJ1bSA9IGQxKGVuZzEpOwoKICAgICAgICAvLyBDYWxsIDI6IHBpY2sgaW1hZ2Ug4oCUIFNBTUUgc2VlZCEKICAgICAgICBzdGQ6Om10MTk5MzcgZW5nMihkYXkpOwogICAgICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gZDIoMCwgYWxidW1TaXplc1thbGJ1bV0gLSAxKTsKICAgICAgICBpbnQgaW1hZ2UgPSBkMihlbmcyKTsKCiAgICAgICAgZnJlcVt7YWxidW0sIGltYWdlfV0rKzsKICAgICAgICBzZWVuLmluc2VydCh7YWxidW0sIGltYWdlfSk7CiAgICB9CgogICAgc3RkOjpjb3V0IDw8ICJEYXlzOiAiIDw8IGRheXMgPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCAiVG90YWwgaW1hZ2VzOiAiIDw8IHRvdGFsSW1hZ2VzIDw8ICJcbiI7CiAgICBzdGQ6OmNvdXQgPDwgIlVuaXF1ZSBzaG93bjogIiA8PCBzZWVuLnNpemUoKSA8PCAiXG5cbiI7CgogICAgaW50IG1pbkYgPSAxZTksIG1heEYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgCiAgICBmb3IgKGF1dG8gaXQgPSBmcmVxLmJlZ2luKCk7IGl0ICE9IGZyZXEuZW5kKCk7ICsraXQpIHsKICAgICAgICBpZiAoaXQtPnNlY29uZCA8IG1pbkYpIG1pbkYgPSBpdC0+c2Vjb25kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhGKSBtYXhGID0gaXQtPnNlY29uZDsKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBzdGQ6OmNvdXQgPDwgIk1pbiBmcmVxOiAiIDw8IG1pbkYgPDwgIiwgTWF4IGZyZXE6ICIgPDwgbWF4RiA8PCAiXG5cbiI7CgogICAgLy8gUGVyLWFsYnVtIGJyZWFrZG93bgogICAgZm9yIChpbnQgYSA9IDA7IGEgPCBudW1BbGJ1bXM7IGErKykgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChhdXRvIGl0ID0gc2Vlbi5iZWdpbigpOyBpdCAhPSBzZWVuLmVuZCgpOyArK2l0KQogICAgICAgICAgICBpZiAoaXQtPmZpcnN0ID09IGEpIGNvdW50Kys7CiAgICAgICAgc3RkOjpjb3V0IDw8IG5hbWVzW2FdIDw8ICI6ICIgPDwgY291bnQgPDwgIi8iIDw8IGFsYnVtU2l6ZXNbYV0gPDwgIiBzaG93blxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9