#include <iostream>
#include <random>
#include <cstring>
typedef unsigned int uint32;
const uint32 arrSize = 500;
uint32 myRandom()
{
static thread_local std::mt19937 prng(std::random_device{}());
static thread_local std::uniform_int_distribution<uint32> dist(0u, arrSize-1u);
return dist(prng);
}
int main()
{
bool* arr = new bool[arrSize];
uint32 steps = 0;
const int numIter = 100;
for (int i = 0; i < numIter; ++i)
{
int numFilled = 0;
memset(arr, 0, arrSize * sizeof(bool));
while (numFilled < arrSize)
{
uint32 r = myRandom();
if (!arr[r])
{
arr[r] = true;
++numFilled;
}
++steps;
}
}
std::cout << "Steps: " << double(steps)/double(numIter) << "\t nlogn: " << double(arrSize)*log(double(arrSize)) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8Y3N0cmluZz4KdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwoKY29uc3QgdWludDMyIGFyclNpemUgPSA1MDA7Cgp1aW50MzIgbXlSYW5kb20oKQp7CglzdGF0aWMgdGhyZWFkX2xvY2FsIHN0ZDo6bXQxOTkzNyBwcm5nKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpOwoJc3RhdGljIHRocmVhZF9sb2NhbCBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjx1aW50MzI+IGRpc3QoMHUsIGFyclNpemUtMXUpOwoKCXJldHVybiBkaXN0KHBybmcpOwp9CgppbnQgbWFpbigpCnsKCWJvb2wqIGFyciA9IG5ldyBib29sW2FyclNpemVdOwoJdWludDMyIHN0ZXBzID0gMDsKCWNvbnN0IGludCBudW1JdGVyID0gMTAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyOyArK2kpCgl7CgkJaW50IG51bUZpbGxlZCA9IDA7CgkJbWVtc2V0KGFyciwgMCwgYXJyU2l6ZSAqIHNpemVvZihib29sKSk7CgoJCXdoaWxlIChudW1GaWxsZWQgPCBhcnJTaXplKQoJCXsKCQkJdWludDMyIHIgPSBteVJhbmRvbSgpOwoJCQlpZiAoIWFycltyXSkKCQkJewoJCQkJYXJyW3JdID0gdHJ1ZTsKCQkJCSsrbnVtRmlsbGVkOwoJCQl9CgkJCSsrc3RlcHM7CgkJfQoJfQoKCXN0ZDo6Y291dCA8PCAiU3RlcHM6ICIgPDwgZG91YmxlKHN0ZXBzKS9kb3VibGUobnVtSXRlcikgPDwgIlx0IG5sb2duOiAiIDw8IGRvdWJsZShhcnJTaXplKSpsb2coZG91YmxlKGFyclNpemUpKSA8PCAiXG4iOwoKCXJldHVybiAwOwp9