#include <random>
#include <map>
#include <iostream>
#include <algorithm>
std::map<int, int> runLength(int range, int iterations)
{
std::mt19937 rng(0);
auto seed = std::random_device{}();
rng.seed(seed);
std::uniform_int_distribution<int> dist(0, range - 1);
int run = 0;
int prev = -1;
std::map<int, int> runLengthCount;
for (int i = 0; i < iterations; i++)
{
int val = dist(rng);
if (val == prev)
++run;
else
{
++runLengthCount[run];
run = 0;
}
prev = val;
}
return runLengthCount;
}
int main(int argc, char** argv)
{
int range = 2;
int iterations = 100000;
if (argc > 1)
range = atoi(argv[1]);
if (argc > 2)
iterations = atoi(argv[2]);
auto result = runLength(range, iterations);
std::cout << "Length\tOccurrences\n";
for (auto& [key, value] : result)
std::cout << key << "\t" << value << "\n";
return 0;
}
I2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKCnN0ZDo6bWFwPGludCwgaW50PiBydW5MZW5ndGgoaW50IHJhbmdlLCBpbnQgaXRlcmF0aW9ucykKewoJc3RkOjptdDE5OTM3IHJuZygwKTsKCWF1dG8gc2VlZCA9IHN0ZDo6cmFuZG9tX2RldmljZXt9KCk7Cglybmcuc2VlZChzZWVkKTsKCglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QoMCwgcmFuZ2UgLSAxKTsKCglpbnQgcnVuID0gMDsKCWludCBwcmV2ID0gLTE7CglzdGQ6Om1hcDxpbnQsIGludD4gcnVuTGVuZ3RoQ291bnQ7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspCgl7CgkJaW50IHZhbCA9IGRpc3Qocm5nKTsKCQlpZiAodmFsID09IHByZXYpCgkJCSsrcnVuOwoJCWVsc2UKCQl7CgkJCSsrcnVuTGVuZ3RoQ291bnRbcnVuXTsKCQkJcnVuID0gMDsKCQl9CgoJCXByZXYgPSB2YWw7Cgl9CgoJcmV0dXJuIHJ1bkxlbmd0aENvdW50Owp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCnsKCWludCByYW5nZSA9IDI7CglpbnQgaXRlcmF0aW9ucyA9IDEwMDAwMDsKCglpZiAoYXJnYyA+IDEpCgkJcmFuZ2UgPSBhdG9pKGFyZ3ZbMV0pOwoJaWYgKGFyZ2MgPiAyKQoJCWl0ZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbMl0pOwoKCWF1dG8gcmVzdWx0ID0gcnVuTGVuZ3RoKHJhbmdlLCBpdGVyYXRpb25zKTsKCglzdGQ6OmNvdXQgPDwgIkxlbmd0aFx0T2NjdXJyZW5jZXNcbiI7Cglmb3IgKGF1dG8mIFtrZXksIHZhbHVlXSA6IHJlc3VsdCkKCQlzdGQ6OmNvdXQgPDwga2V5IDw8ICJcdCIgPDwgdmFsdWUgPDwgIlxuIjsKCglyZXR1cm4gMDsKfQ==